最近要把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的惟五捷徑!