Swift和Object-C的區別和優缺點
一、Swift和Objective-C的聯絡
Swift和Objective-C共用一套執行時環境,Swift的型別可以橋接到Objective-C(下面我簡稱OC),反之亦然。兩者可以互相引用混合程式設計。其次就是,OC之前積累的很多類庫,在Swift中大部分依然可以直接使用,當然,Swift3之後,一些語法改變了很多,不過還是有跡可循的。OC出現過的絕大多數概念,比如引用計數、ARC、屬性、協議、介面、初始化、擴充套件類、命名引數、匿名函式等,在Swift中繼續有效(可能最多換個術語)。Swift大多數概念與OC一樣。當然Swift也多出了一些新興概念,這些在OC中是沒有的,比如範型、元組等。
但是:現階段Swift 到底能不能取代 Objective-C?
答案是還不行。
其實到現在為止 Swift 離完全替代 Objective-C 還是很遙遠,因為 Apple 內部一直在用 Objective-C 來做一些 Framework 的開發,底層也不可能用 Swift 實現,所以現在更多的替代是體現在外部開發。
二、Swift比Objective-C有什麼優勢?
1、Swift容易閱讀,語法和檔案結構簡易化。
2、Swift更易於維護,檔案分離後結構更清晰。
3、Swift更加安全,它是型別安全的語言。
4、Swift程式碼更少,簡潔的語法,可以省去大量冗餘程式碼
5、Swift速度更快,運算效能更高。
三、Swift目前存在的缺點
1、版本不穩定,之前升級Swift3大動刀,苦了好多人,swift4目前還未知
2、使用人數比例偏低,目前還是OC的天下
3、社群的開源專案偏少,畢竟OC獨大好多年,很多優秀的類庫都不支援Swift,不過這種狀況正在改變,現在有好多優秀的Swift的開源類庫了
4、公司使用的比例不高,很多公司以穩為主,還是在使用OC開發,很少一些在進行混合開發,更少一些是純Swift開發。
5、偶爾開發中遇到的一些問題,很難查詢到相關資料,這是一個弊端。
6、純Swift的執行時和OC有本質區別,一些OC中執行時的強大功能,在純Swift中變無效了。
7、對於不支援Swift的一些第三方類庫,如果非得使用,只能混合程式設計,利用橋接檔案實現。
四、Swift其他功能說明
1、Swift的記憶體管理
Swift使用自動引用計數(ARC)來簡化記憶體管理,與OC一致。
2、Swift的可選項型別(Optionals)介紹
Swift引入了可選項型別,用於處理變數值不存在的情況。Optionals類似於OC中指向nil的指標,但是適用於所有資料型別,而非僅僅侷限於類,Optionals相比於OC中的nil指標,更加安全和簡明,並且也是Swift諸多最強大功能的核心。
3、Swift中的 !和 ?
這兩個符號是用來標記這個變數的值是否可選,!表示可選變數必須保證轉換能夠成功,否則報錯,但定義的變數可以直接使用;?表示可選變數即使轉換不成功也不會報錯,變數值為nil,如果轉換成功,要使用該變數時,後面需要加!進行修飾。
4、Swift中範型的簡單說明
範型是用來使程式碼能安全工作,swift中的範型可以在函式資料和普通資料型別中使用,例如類、結構體或列舉。範型可以解決程式碼複用的問題
//舉個簡單例子:這兩個方法很類似,主要就一個引數型別的區別。
func isIntEqual(x:Int,y:Int) -> Bool {
return x == y
}
func isStringEqual(x:String,y:String) -> Bool {
return x == y
}
//我們可以利用範型合併一下:
func isObjEqual<T:Equatable>(x:T,y:T) -> Bool {
return x == y
}
這樣,當我們使用時,我們如果將兩個不同型別的數進行比較,編譯器會馬上提醒我們,從而快速避免這種情況。
5、Swift的訪問許可權變更
swift新增了兩種訪問許可權,許可權更細化。具體檢視這裡:
6、Swift Foundation框架
為了方便使用,Swift的基本型別都可以無縫轉換到 Foundation 框架中的對應型別。
因為 Cocoa 框架所接受和返回的基本資料型別都是自身框架內的型別,也就是 Foundation 中所定義的像 NSString,NSNumber,NSArray 等這些東西。而脫離 Cocoa 框架進行 app 開發是不可能的事情。因此我們在使用 Swift 開發 app 時無法避免地需要在 Swift 型別和 Foundation 型別間進行轉換。如果需要每次顯式地書寫轉換的話,大概就沒人會喜歡用 Swift 了。還好 Swift 與 Foundation 之間的型別轉換是可以自動完成的,這使得通過 Swift 使用 Cocoa 時順暢了很多。
而且這個轉換不僅是自動的,而且是雙向的,而且無論何時只要有可能,轉換的結果會更傾向於使用 Swift 型別。也就是說,只要你不寫明型別是需要 NS 開頭的型別的時候,你都會得到一個 Swift 型別。
所以,Swift中的型別和OC的型別對應關係:
String - NSString
Int, Float, Double, Bool 以及其他與數字有關的型別 - NSNumber
Array - NSArray Dictionary - NSDictionary
7、Swift便捷的函數語言程式設計
Swift提供了Map、FlatMap、Filter、Reduce等函式方法,能夠大大方便我們對物件處理。
舉例最簡單的場景:
Map:
var results = [1,3,5,7] let results = values.map ({ (element) -> Int in
return element * 2
})
//"[2, 6, 10, 14]"
Filter:
var values = [1,3,5,7,9]
let flattenResults = values.filter{ $0 % 3 == 0}
//[3, 9]
Reduce:
var values = [1,3,5]
let initialResult = 0
var reduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> Int in
return tempResult + element
})
print(reduceResult)
//9
五、其他補充
========================= swift獨有 ====================
1、範圍運算子
a...b 表示 [a,b] 包括a和b 。 (如3...5 就是範圍取3,4,5)
a..<b 表示 [a,b) 包括a,不包括b 。 (如3...5 就是範圍取3,4)
常見的如for迴圈:for i in 0...9{}
2、獨有的元組型別
元組(tuples)把多個值組合成一個複合值。元組內的值可以使任意型別,並不要求是相同型別。eg:
var value = (Int,String) = (x:15,y:"abc")
3、swift中使用let定義常量,var定義變數
使用常量,更加安全,不能夠被修改,在需要對物件進行修改的時候 只能用var修飾.
4、if let 、 guard let 的用法
縮減程式碼量,安全處理資料邏輯。
========================= 細節使用區別 ====================
1、swift不分.h和.m檔案 ,一個類只有.swift一個檔案,所以整體的檔案數量比起OC有一定減少。
2、swift句尾不需要分號 ,除非你想在一行中寫三行程式碼就加分號隔開。
3、swift資料型別都會自動判斷 , 只區分變數var 和常量let
4、強制型別轉換格式不同 OC強轉:(int)a Swift強轉:Int(a)
5、關於BOOL型別更加嚴格 ,Swift不再是OC的非0就是真,而是true才是真false才是假
6、swift的 迴圈語句中必須加{} 就算只有一行程式碼也必須要加
7、swift的switch語句後面可以跟各種資料型別了 ,如Int、字串都行,並且裡面不用寫break(OC好像不能字串)
8、swift if後的括號可以省略: if a>b {},而OC裡 if後面必須寫括號。
9、swift列印 用print("") 列印變數時可以 print("\(value)"),不用像OC那樣記很多%@,d%等。
10、Swift3的【Any】可以代表任何型別的值,無論是類、列舉、結構體還是任何其他Swift型別,這個對應OC中的【id】型別。
六、Swift的前景
可能很多人會問,到底該不該學Swift,難度大不大?
我的理解是:
如果時間可以,可以試著學習,最好能試著寫一點程式碼,單純的看書或看教程沒太大意義,實踐出真知。
其實最初期的學習,更多的是語法的轉變而已,這裡的難點是不大的,而Swift的思想我們可以後期慢慢學習並深入體會。
最後,我還是希望Swift發展的越來越好,功能和社群完善的更棒