最近要把weex
集成到App中,须要给iOS
和安卓
提供库文件,这里的库文件并非WeexSDK
,而是链接iOS
和Weex
的中间件,因此就接触到oc
,若是你也和我同样,须要集成weex
,那恭喜你,oc
你也须要学习。你可能会有个疑问,不是有专职的iOS
工程师嘛,干吗还须要前端来写,我是这么想的:javascript
weex
的发起者,同时你也是推进者,App要集成这项目技术,iOS工程师固然但愿集成越简单,对现有功能影响越小越好,那天然不能把weex
和他们的代码混到一块儿,那这块相对独立的功能天然是前端来作最合适iOS
的一次绝佳的机会,爱学习的你,真的愿意拱手相让么?既然咱们是作前端的,对一门新语言只要大体知道语法还有这门语言的特色(这块会着重介绍),不过三天,你会写的js同样熟练,好,咱们开始咱们的第一个Hello World!
前端
咱们先使用xcode
来开发入门的IDE
。新建项目的时候,咱们须要注意一下,既然是入门语法(不涉及画UI),咱们没有必要搞那么复杂,就选择最简单的类型:命令行。java
运行结果:web
新建完成以后,咱们就能看到main.m
文件,使用cmd+R
来运行,就能够在命令行看到效果,下面咱们来依次介绍语法,保证简洁!ajax
int
类型没啥好说的,就这样定义就行:int a = 10;
string
类型比较特殊,字符串属性对象类型,因此咱们定义时,在字符串前面须要加一个@
,变量名称前加*
,这样定义:NSString *name = @"james";
其中NSString
就表明字符串类型。占位符应用比较多的场景是NSLog
,也就是咱们js的console.log
,打印变量是咱们开发中经常使用到的功能,oc
中咱们使用占位符来表明变量,好比咱们要打印int age = 10; NSString *name = @"james";
,咱们能够这样作:npm
NSLog(@"姓名:%@,年龄:%d", name, age);
其中:%@
表明对象类型的占位符;%d
表明整型的占位符。json
在oc
中,方法的定义比较特殊,差很少长这样:xcode
+ (void) test { NSLog(@"Hello World!"); } - (NSString *) test1:(NSString *)key { return key; }
这里面你发现没有function
这样的关健字,缓存
+
号表明静态方法,-
号表明实例方法(须要实例化后才能使用)void
表明无返回test
和test1
表明方法名称(NSString *) key
表明参数类型和参数变量名多参数的方法,在这里要好好的说一下,初始接触oc,你确定会以为莫名其妙,咱们先来看下多参数方法的定义:websocket
-(void)login:(NSString *)userName password:(NSString *)pwd { NSLog(@"userName=%@, password=%@", userName, pwd); }
看起来是否是有点蒙,这和咱们以前任何一种语言方法的定义都不同,如今咱们一张图就能说明白,看懂了以后,习惯就行了
任何面对对象的语言都有类,oc也不例外,新建类的时候,咱们选择:macOS
-->Cocoa Class
,这样在项目中,你会发现两个文件,一个*.h
文件和*.m
文件,下面咱们分别介绍
*.h
文件的做用#import <Foundation/Foundation.h> @interface Test : NSObject -(void) test; @end
这里面只定义须要外部访问的方法结构,也就是对外的方法,具体实现是在.m
文件中
类的使用,也和其余语言不太同样,咱们先来看一张图
alloc
分配内存,init
才是实例化,在其余语言中new
其实执行的也是这两步[对象 方法]
这种形式,而不是以对象.方法
的形式,这和其余语言区别比较大对象.属性
代码块这个词你乍一听挺陌生,我举一个咱们js里面常常用的例子,你就明白了。
function add(age, cb) { age += 1 cb(age) } add(20, function(newAge){ console.log(newAge) })
oc里面的代码码对应的就是add
方法中的cb,js是由于是弱类型语言,因此不须要定义类型,可是oc是强类型的,要用就必须定义,那cb是啥类型呢,就是代码块类型!其实这种类型解决的一个主要问题就是异步回调,和咱们js里面的用法差很少,咱们看下oc里面怎么使用
// 定义一个block typedef void(^callbackBlock)(NSString *data); // 定义方法 + (void)ajax:(NSString *)url cb:(callbackBlock)aCallback { ...... aCallback(@"Hello") ...... } // 使用方法 [YourClass ajax:@"xxxx", cb:^(NSString *data){ NSLog(data); }]
oc里面的协议(Protocol)和java里面的接口(interface)比较相似,都是只定义,不实现;都须要一个类来实现这个协议和协议里面的方法。咱们来看下语法:
#import <Foundation/Foundation.h> // @protocol为关健字,定义这个类是一个协议类 @protocol TestProtocol <NSObject> // @required为关健字,表明必需要实现的方法 @required - (void)req; // @required为关健字,表明未必要实现的方法 @optional - (void)opt; @end
Test.h
文件#import <Foundation/Foundation.h> // 引入协议类 #import "TestProtocol.m" // NSObject<TestProtocol>让Test类知道必须实现协议的方法 @interface Test : NSObject<TestProtocol> // 注:这里面不用定义协议类的方法,须要在.m文件中定义和实现 @end
Test.m
文件#import "Test.h" @implementation Test -(void)req { NSLog(@"实现协议方法"); } // 注:就算是@required方法,类中不实现依然不会报错,编译也能经过,只是给个警告 @end
看完了你可能会以为这玩意有啥用啊,其实协议的用途主要是在运行时(runtime),尤为是weex
和已有项目集成时,若是没有这个东西,根本就集成不起来,这块内容咱们后面会说。
json
对象与oc
oc
中存储json
对象的类型是:NSDictionary
,咱们来看下咱们前端常用的一些json
方法
json
NSString *jsonString = @"{\"id\":1}"; // 先转成NSData类型 NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; // 再转成NSDictionary NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:nil]; // 根据key获取value NSLog(@"%@",dic[@"id"]);
json
对象循环for (NSString *key in dic) { NSLog(@"key=%@, value=%@", key, dic[key]); }
其实这篇文章并不没有教你在oc中for循环怎么写,if/else怎么写,由于你写过js,这些根本就不用教,天然就会,我写的都是oc
这门语言,我在使用过程当中,和javascript
以及java
中,须要注意的地方,同时我也没有说UI方面的东西,好比按钮怎么写、怎么设置背景颜色...缘由有两个:
weex
集成到App中提供的公共服务,根本就涉及不到UI在集成weex
的时候,须要写大量的oc
逻辑代码,这部分功能就是咱们提供给现有的App的一个pod
(相似npm包),里面包括:缓存js文件、读取js文件、写weex
的扩展module、把业务类注入到pod
中使用、调试中使用到的websocket
...因此当你在实现的过程当中,你天然就熟悉了这门语言。多写才是掌握OC的惟五捷径!