2020 iOS面試題----swift和oc的區(qū)別?

淺談Swift和OC的區(qū)別

前言

一晃Swift都出來快幾年了,從OC到Swift也經歷了很多,所以對兩者的一些使用區(qū)別也總結了一點,暫且記錄下,權當自己的一個筆記。

當然其中一些區(qū)別可能大家都有耳聞,所以這里也會結合自身的一些平常記錄,稍許整理,才誕生了本篇文章,中間或許會有不對之處,還望指出來,共同進步。

正文

一、Swift和Objective-C的聯系

Swift和Objective-C共用一套運行時環(huán)境,Swift的類型可以橋接到Objective-C(下面我簡稱OC),反之亦然。兩者的互相引用混合編程我之前有寫過簡單介紹,有興趣的可以移步這里:

iOS OC和Swift進行互相調用

其次就是,OC之前積累的很多類庫,在Swift中大部分依然可以直接使用,當然,Swift3之后,一些語法改變了很多,不過還是有跡可循的。OC出現過的絕大多數概念,比如引用計數、ARC、屬性、協議、接口、初始化、擴展類、命名參數、匿名函數等,在Swift中繼續(xù)有效(可能最多換個術語)。Swift大多數概念與OC一樣。當然Swift也多出了一些新興概念,這些在OC中是沒有的,比如范型、元組等。

但是:現階段Swift 到底能不能取代 Objective-C?

答案是還不行。

其實到現在為止 Swift 離完全替代 Objective-C 還是很遙遠,因為 Apple 內部一直在用 Objective-C 來做一些 Framework 的開發(fā),底層也不可能用 Swift 實現,所以現在更多的替代是體現在外部開發(fā)。

二、Swift比Objective-C有什么優(yōu)勢?

1、Swift容易閱讀,語法和文件結構簡易化。

2、Swift更易于維護,文件分離后結構更清晰。

3、Swift更加安全,它是類型安全的語言。

4、Swift代碼更少,簡潔的語法,可以省去大量冗余代碼

5、Swift速度更快,運算性能更高。

****三、Swift目前存在的缺點****

1、版本不穩(wěn)定,之前升級Swift3大動刀,苦了好多人,swift4目前還未知

2、使用人數比例偏低,目前還是OC的天下

3、社區(qū)的開源項目偏少,畢竟OC獨大好多年,很多優(yōu)秀的類庫都不支持Swift,不過這種狀況正在改變,現在有好多優(yōu)秀的Swift的開源類庫了

4、公司使用的比例不高,很多公司以穩(wěn)為主,還是在使用OC開發(fā),很少一些在進行混合開發(fā),更少一些是純Swift開發(fā)。

5、偶爾開發(fā)中遇到的一些問題,很難查找到相關資料,這是一個弊端。

6、純Swift的運行時和OC有本質區(qū)別,一些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中的范型可以在函數數據和普通數據類型中使用,例如類、結構體或枚舉。范型可以解決代碼復用的問題,

舉個簡單例子:這兩個方法很類似,主要就一個參數類型的區(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
}

這樣,當我們使用時,我們如果將兩個不同類型的數進行比較,編譯器會馬上提醒我們,從而快速避免這種情況。

5、Swift的訪問權限變更

swift新增了兩種訪問權限,權限更細化。具體查看這里:

訪問權限 **由大到小 **依次為:open,public,internal(默認),fileprivate,private

6、Swift Foundation框架

為了方便使用,Swift的基本類型都可以無縫轉換到 Foundation 框架中的對應類型。

因為 Cocoa 框架所接受和返回的基本數據類型都是自身框架內的類型,也就是 Foundation 中所定義的像 NSString,NSNumber,NSArray 等這些東西。而脫離 Cocoa 框架進行 app 開發(fā)是不可能的事情。因此我們在使用 Swift 開發(fā) app 時無法避免地需要在 Swift 類型和 Foundation 類型間進行轉換。如果需要每次顯式地書寫轉換的話,大概就沒人會喜歡用 Swift 了。還好 Swift 與 Foundation 之間的類型轉換是可以自動完成的,這使得通過 Swift 使用 Cocoa 時順暢了很多。

而且這個轉換不僅是自動的,而且是雙向的,而且無論何時只要有可能,轉換的結果會更傾向于使用 Swift 類型。也就是說,只要你不寫明類型是需要 NS 開頭的類型的時候,你都會得到一個 Swift 類型。

所以,Swift中的類型和OC的類型對應關系:

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">String - NSString
Int, Float, Double, Bool 以及其他與數字有關的類型 - NSNumber
Array - NSArray
Dictionary - NSDictionary</pre>

7、Swift便捷的函數式編程

Swift提供了Map、FlatMap、Filter、Reduce等函數方法,能夠大大方便我們對對象處理。

舉例最簡單的場景:

Map:

<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; 
font-size: 12px !important;">var results = [1,3,5,7]
let results = values.map ({ (element) -> Int in
return element * 2 }) //"[2, 6, 10, 14]"</pre>

Filter:

    <pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">var values = [1,3,5,7,9]
let flattenResults = values.filter{ $0 % 3 == 0} //[3, 9]</pre>

Reduce:


<pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">var values = [1,3,5]
let initialResult = 0
var reduceResult = values.reduce(initialResult, combine: { (tempResult, element) -> Int in
    return tempResult + element
})
print(reduceResult) //9</pre>

五、其他補充

========================= 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)把多個值組合成一個復合值。元組內的值可以使任意類型,并不要求是相同類型。eg:

<pre style="margin: 0px; padding: 0px; overflow: auto; 
overflow-wrap: break-word; font-family: &quot;Courier New&quot;
 !important; font-size: 12px !important;">var value = (Int,String) = (x:15,y:"abc")</pre>

3、swift中使用let定義常量,var定義變量

使用常量,更加安全,不能夠被修改,在需要對對象進行修改的時候 只能用var修飾.

4、if let 、 guard let 的用法

縮減代碼量,安全處理數據邏輯。

========================= 細節(jié)使用區(qū)別 ====================

1、swift不分.h和.m文件 ,一個類只有.swift一個文件,所以整體的文件數量比起OC有一定減少。

2、swift句尾不需要分號 ,除非你想在一行中寫三行代碼就加分號隔開。

3、swift數據類型都會自動判斷 , 只區(qū)分變量var 和常量let

4、強制類型轉換格式不同 OC強轉:(int)a Swift強轉:Int(a)

5、關于BOOL類型更加嚴格 ,Swift不再是OC的非0就是真,而是true才是真false才是假

6、swift的 循環(huán)語句中必須加{} 就算只有一行代碼也必須要加

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發(fā)展的越來越好,功能和社區(qū)完善的更棒。

七、附上推薦文章鏈接:

1、無論你是否主力 Swift, 這些事情你都可以了解一下

2、Swift 再等等?我的答案是:快上車

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Swift 是蘋果在2014年推出的面向對象開發(fā)的語言,用來撰寫OS X 和 iOS 應用程序的強類型語言。目前越...
    神跡之風閱讀 7,383評論 0 34
  • 1、類(class)和結構體(struct)有什么區(qū)別? 在Swift中,class是引用類型,struct是值類...
    Longshihua閱讀 4,502評論 0 38
  • Swift 網上有很多Swift的語法題,但是Swift現在語法還未穩(wěn)定,所以在這里暫時不貼出語法題,可以自行搜索...
    b485c88ab697閱讀 5,071評論 0 14
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學已經沒多少時間了。班主任說已經安排了三個家長分享經驗。 放學鈴聲...
    飄雪兒5閱讀 7,868評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉變要...
    余生動聽閱讀 10,918評論 0 11

友情鏈接更多精彩內容