前端集成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的惟五捷徑!

相關文章
相關標籤/搜索