swift優(yōu)勢:
兼容性:
- 對oc無縫兼容:
通過建立橋接文件實現(xiàn)使用swift語法調(diào)用原oc代碼
例如:新建zaozuo-ios-Bridging-Header.h文件,導(dǎo)入oc需要暴露給swift的類
//FMDB
#import "FMDB.h"
// shareSdk
#import <ShareSDK/ShareSDK.h>
#import <ShareSDKUI/ShareSDK+SSUI.h>
#import <ShareSDKConnector/ShareSDKConnector.h>
//騰訊SDK頭文件
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterface.h>
//微信SDK頭文件
#import "WXApi.h"
//新浪微博SDK頭文件
#import "WeiboSDK.h"
- Foundation球昨、UiKit等系統(tǒng)框架保持oc調(diào)用方式
新特性:
- 新增泛型;
- 支持閉包(類似block)辕近,可用于回調(diào);
- 新增元組;
- 數(shù)據(jù)類型更加簡潔迹冤,常用基本數(shù)據(jù)類型:String讽营、Int、Double泡徙、Array<T>橱鹏、Dictionary<K, V>、Set<T> 堪藐,Array莉兰、Dictionary都具有可變性 ;
- 函數(shù)支持嵌套礁竞、多返回值(借助元組)糖荒,函數(shù)作為參數(shù)傳遞;
- 新增Optionals,借助Optionals nil檢查減少空指針異常模捂;
- 新增as語法捶朵,可用于類型轉(zhuǎn)換, 例如:String as NSString;
- 無所不能的switch枫绅。
swift劣勢:
兼容性問題
- swift調(diào)用原有oc導(dǎo)致的類型轉(zhuǎn)換問題:
例如:原oc中NSArray會被轉(zhuǎn)換為Array<AnyObject>泉孩,如果原oc NSArray中存放的對象非繼承自AnyObject(例如:枚舉類型)帶來的轉(zhuǎn)換問題(枚舉類型可調(diào)用rawValue傳入原始值); - 枚舉等一些特殊類型調(diào)用方式略變并淋。
CocoaPods支持問題:
-
Embedded frameworks require a minimum deployment target of iOS 8
deployment target:7.0+無法使用CocoaPods引入swift開源庫; - 7.0+ CocoaPods替代方案:
采用swift library 可采用git subModule管理(當(dāng)項目target:8.0+只需移除subModule寓搬,加入到CocoaPods),oc library 可保持CocoaPods依賴方式;
nil 處理方式改變县耽,可能引入的新問題:
- swift采用Optionals處理變量值為nil的情況句喷,正常情況下增強了調(diào)用的安全性镣典,對于Optionals類型如果采用!強制取值可能引發(fā)無法避免的空指針;
例如:
public static func dictionaryToEntityList<T:BaseModel>(set:FMResultSet)
-> Array<T>{
var arr:Array<T> = []
while set.next(){
var entity:AnyObject = T.classForCoder().alloc()
if entity is T{
dictionaryToEntity(set.resultDictionary(), object: entity as! T)
arr.append(entity as! T)
}
}
return arr
}
上面函數(shù)唾琼,傳入的參數(shù)set是非Optionals兄春,當(dāng)采用以下方式調(diào)用時,可能引發(fā)空指針異常锡溯,而在dictionaryToEntityList函數(shù)中卻無法避免此問題
var set:FMResultSet? = nil
dictionaryToEntityList(set!)
- 解決方案:
將set更改為Optionals或在dictionaryToEntityList函數(shù)中傳入set前做非nil校驗赶舆。
UI方案:
采用storyborad:
- 多人協(xié)作不可同時修改storyboard中同一個ViewController