Swift和Object-C的区别和优缺点
一、Swift和Objective-C的聯(lián)系
Swift和Objective-C共用一套運行時環(huán)境,Swift的類型可以橋接到Objective-C(下面我簡稱OC),反之亦然。兩者可以互相引用混合編程。其次就是,OC之前積累的很多類庫,在Swift中大部分依然可以直接使用,當然,Swift3之后,一些語法改變了很多,不過還是有跡可循的。OC出現(xiàn)過的絕大多數(shù)概念,比如引用計數(shù)、ARC、屬性、協(xié)議、接口、初始化、擴展類、命名參數(shù)、匿名函數(shù)等,在Swift中繼續(xù)有效(可能最多換個術(shù)語)。Swift大多數(shù)概念與OC一樣。當然Swift也多出了一些新興概念,這些在OC中是沒有的,比如范型、元組等。
?
但是:現(xiàn)階段Swift 到底能不能取代 Objective-C?
答案是還不行。
其實到現(xiàn)在為止 Swift 離完全替代 Objective-C 還是很遙遠,因為 Apple 內(nèi)部一直在用 Objective-C 來做一些 Framework 的開發(fā),底層也不可能用 Swift 實現(xiàn),所以現(xiàn)在更多的替代是體現(xiàn)在外部開發(fā)。
二、Swift比Objective-C有什么優(yōu)勢?
?
1、Swift容易閱讀,語法和文件結(jié)構(gòu)簡易化。
2、Swift更易于維護,文件分離后結(jié)構(gòu)更清晰。
3、Swift更加安全,它是類型安全的語言。
4、Swift代碼更少,簡潔的語法,可以省去大量冗余代碼
5、Swift速度更快,運算性能更高。
三、Swift目前存在的缺點
?
1、版本不穩(wěn)定,之前升級Swift3大動刀,苦了好多人,swift4目前還未知
2、使用人數(shù)比例偏低,目前還是OC的天下
3、社區(qū)的開源項目偏少,畢竟OC獨大好多年,很多優(yōu)秀的類庫都不支持Swift,不過這種狀況正在改變,現(xiàn)在有好多優(yōu)秀的Swift的開源類庫了
4、公司使用的比例不高,很多公司以穩(wěn)為主,還是在使用OC開發(fā),很少一些在進行混合開發(fā),更少一些是純Swift開發(fā)。
5、偶爾開發(fā)中遇到的一些問題,很難查找到相關(guān)資料,這是一個弊端。
6、純Swift的運行時和OC有本質(zhì)區(qū)別,一些OC中運行時的強大功能,在純Swift中變無效了。
7、對于不支持Swift的一些第三方類庫,如果非得使用,只能混合編程,利用橋接文件實現(xiàn)。
四、Swift其他功能說明
?
1、Swift的內(nèi)存管理
Swift使用自動引用計數(shù)(ARC)來簡化內(nèi)存管理,與OC一致。
2、Swift的可選項類型(Optionals)介紹
Swift引入了可選項類型,用于處理變量值不存在的情況。Optionals類似于OC中指向nil的指針,但是適用于所有數(shù)據(jù)類型,而非僅僅局限于類,Optionals相比于OC中的nil指針,更加安全和簡明,并且也是Swift諸多最強大功能的核心。
3、Swift中的 !和 ??
這兩個符號是用來標記這個變量的值是否可選,!表示可選變量必須保證轉(zhuǎn)換能夠成功,否則報錯,但定義的變量可以直接使用;?表示可選變量即使轉(zhuǎn)換不成功也不會報錯,變量值為nil,如果轉(zhuǎn)換成功,要使用該變量時,后面需要加!進行修飾。
4、Swift中范型的簡單說明
范型是用來使代碼能安全工作,swift中的范型可以在函數(shù)數(shù)據(jù)和普通數(shù)據(jù)類型中使用,例如類、結(jié)構(gòu)體或枚舉。范型可以解決代碼復(fù)用的問題
//舉個簡單例子:這兩個方法很類似,主要就一個參數(shù)類型的區(qū)別。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}這樣,當我們使用時,我們?nèi)绻麑蓚€不同類型的數(shù)進行比較,編譯器會馬上提醒我們,從而快速避免這種情況。
?
5、Swift的訪問權(quán)限變更
swift新增了兩種訪問權(quán)限,權(quán)限更細化。具體查看這里:
訪問權(quán)限?由大到小?依次為:open,public,internal(默認),fileprivate,private
?
6、Swift Foundation框架
為了方便使用,Swift的基本類型都可以無縫轉(zhuǎn)換到 Foundation 框架中的對應(yīng)類型。
因為 Cocoa 框架所接受和返回的基本數(shù)據(jù)類型都是自身框架內(nèi)的類型,也就是 Foundation 中所定義的像 NSString,NSNumber,NSArray 等這些東西。而脫離 Cocoa 框架進行 app 開發(fā)是不可能的事情。因此我們在使用 Swift 開發(fā) app 時無法避免地需要在 Swift 類型和 Foundation 類型間進行轉(zhuǎn)換。如果需要每次顯式地書寫轉(zhuǎn)換的話,大概就沒人會喜歡用 Swift 了。還好 Swift 與 Foundation 之間的類型轉(zhuǎn)換是可以自動完成的,這使得通過 Swift 使用 Cocoa 時順暢了很多。
而且這個轉(zhuǎn)換不僅是自動的,而且是雙向的,而且無論何時只要有可能,轉(zhuǎn)換的結(jié)果會更傾向于使用 Swift 類型。也就是說,只要你不寫明類型是需要 NS 開頭的類型的時候,你都會得到一個 Swift 類型。
所以,Swift中的類型和OC的類型對應(yīng)關(guān)系:
String - NSString
Int, Float, Double, Bool 以及其他與數(shù)字有關(guān)的類型 - NSNumber
Array - NSArray Dictionary - NSDictionary?7、Swift便捷的函數(shù)式編程
Swift提供了Map、FlatMap、Filter、Reduce等函數(shù)方法,能夠大大方便我們對對象處理。
舉例最簡單的場景:
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循環(huán):for i in 0...9{}
?
2、獨有的元組類型
元組(tuples)把多個值組合成一個復(fù)合值。元組內(nèi)的值可以使任意類型,并不要求是相同類型。eg:
var value = (Int,String) = (x:15,y:"abc")
3、swift中使用let定義常量,var定義變量
使用常量,更加安全,不能夠被修改,在需要對對象進行修改的時候 只能用var修飾.
?
4、if let 、 guard let 的用法
縮減代碼量,安全處理數(shù)據(jù)邏輯。
?
========================= 細節(jié)使用區(qū)別 ====================
1、swift不分.h和.m文件?,一個類只有.swift一個文件,所以整體的文件數(shù)量比起OC有一定減少。
2、swift句尾不需要分號?,除非你想在一行中寫三行代碼就加分號隔開。
3、swift數(shù)據(jù)類型都會自動判斷?, 只區(qū)分變量var 和常量let
4、強制類型轉(zhuǎn)換格式不同 ? OC強轉(zhuǎn):(int)a ? ? ?Swift強轉(zhuǎn):Int(a)
5、關(guān)于BOOL類型更加嚴格?,Swift不再是OC的非0就是真,而是true才是真false才是假?
6、swift的?循環(huán)語句中必須加{}?就算只有一行代碼也必須要加?
7、swift的switch語句后面可以跟各種數(shù)據(jù)類型了?,如Int、字符串都行,并且里面不用寫break(OC好像不能字符串)
8、swift ?if后的括號可以省略: ?if a>b {},而OC里 if后面必須寫括號。
9、swift打印 ?用print("") ? ?打印變量時可以 ?print("\(value)"),不用像OC那樣記很多%@,d%等。
10、Swift3的【Any】可以代表任何類型的值,無論是類、枚舉、結(jié)構(gòu)體還是任何其他Swift類型,這個對應(yīng)OC中的【id】類型。
?
?
?六、Swift的前景
可能很多人會問,到底該不該學(xué)Swift,難度大不大?
我的理解是:
如果時間可以,可以試著學(xué)習,最好能試著寫一點代碼,單純的看書或看教程沒太大意義,實踐出真知。
其實最初期的學(xué)習,更多的是語法的轉(zhuǎn)變而已,這里的難點是不大的,而Swift的思想我們可以后期慢慢學(xué)習并深入體會。
?
最后,我還是希望Swift發(fā)展的越來越好,功能和社區(qū)完善的更棒
總結(jié)
以上是生活随笔為你收集整理的Swift和Object-C的区别和优缺点的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: word 多级列表标题设置
 - 下一篇: Word标题样式设置多级自动编号