前端集成weex,你须要学习的objective-c基础

背景

最近要把weex集成到App中,须要给iOS安卓提供库文件,这里的库文件并非WeexSDK,而是链接iOSWeex的中间件,因此就接触到oc,若是你也和我同样,须要集成weex,那恭喜你,oc你也须要学习。你可能会有个疑问,不是有专职的iOS工程师嘛,干吗还须要前端来写,我是这么想的:javascript

  • 首先你是weex的发起者,同时你也是推进者,App要集成这项目技术,iOS工程师固然但愿集成越简单,对现有功能影响越小越好,那天然不能把weex和他们的代码混到一块儿,那这块相对独立的功能天然是前端来作最合适
  • 其次这是了解全面了解iOS的一次绝佳的机会,爱学习的你,真的愿意拱手相让么?
  • 之后三端的界限会变的不那么清晰了,如今都在提大前端,多接触其余领域也是件好事

前面的话

既然咱们是作前端的,对一门新语言只要大体知道语法还有这门语言的特色(这块会着重介绍),不过三天,你会写的js同样熟练,好,咱们开始咱们的第一个Hello World!前端

开始第一个程序

咱们先使用xcode来开发入门的IDE。新建项目的时候,咱们须要注意一下,既然是入门语法(不涉及画UI),咱们没有必要搞那么复杂,就选择最简单的类型:命令行。java

clipboard.png

运行结果:web

clipboard.png

新建完成以后,咱们就能看到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表明无返回
  • testtest1表明方法名称
  • (NSString *) key表明参数类型和参数变量名

多参数方法

多参数的方法,在这里要好好的说一下,初始接触oc,你确定会以为莫名其妙,咱们先来看下多参数方法的定义:websocket

-(void)login:(NSString *)userName password:(NSString *)pwd {
    NSLog(@"userName=%@, password=%@", userName, pwd);
}

看起来是否是有点蒙,这和咱们以前任何一种语言方法的定义都不同,如今咱们一张图就能说明白,看懂了以后,习惯就行了

clipboard.png

类的介绍

任何面对对象的语言都有类,oc也不例外,新建类的时候,咱们选择:macOS-->Cocoa Class,这样在项目中,你会发现两个文件,一个*.h文件和*.m文件,下面咱们分别介绍

*.h文件的做用

#import <Foundation/Foundation.h>
@interface Test : NSObject
-(void) test;
@end

这里面只定义须要外部访问的方法结构,也就是对外的方法,具体实现是在.m文件中

类的使用

类的使用,也和其余语言不太同样,咱们先来看一张图

clipboard.png

  • 类的实例化须要两步:alloc分配内存,init才是实例化,在其余语言中new其实执行的也是这两步
  • 类对方法的调用使用的是[对象 方法]这种形式,而不是以对象.方法的形式,这和其余语言区别比较大
  • 点的方式也用的到,就是获取对象属性的时候,就是使用这种形式对象.属性

代码块(block)

代码块这个词你乍一听挺陌生,我举一个咱们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);
}]

协议(Protocol)

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
  • 若是上面的东西熟练了,UI其实就是类调用方法,没啥特殊的地方,哪里不会Google哪里就好

在集成weex的时候,须要写大量的oc逻辑代码,这部分功能就是咱们提供给现有的App的一个pod(相似npm包),里面包括:缓存js文件、读取js文件、写weex的扩展module、把业务类注入到pod中使用、调试中使用到的websocket...因此当你在实现的过程当中,你天然就熟悉了这门语言。多写才是掌握OC的惟五捷径!

相关文章
相关标签/搜索