向Swfit編程思想的轉換(譯文)

本文對基于Switching Your Brain to Swift博文的中文翻譯,若有翻譯不當之處,歡迎糾正.

原來的代碼+原來的思想+Swift. 哪里出錯了呢?

最理想的情況當然就是從一個100%的Swift項目開始.如果你能做到,很好.但是多數情況下,我們有著已存在的代碼,卻很想開始使用Swift語言,那我們應該從哪里開始呢?


為什么?

回過來說一下:你為什么想用Swift寫程序呢?原因有很多:Swift語言是編程語言的新星;有著更棒的語法;Swift是蘋果向我們推薦的iOS開發語言.
在將來,Swift的關注度會繼續增加,并且Swift將成為開發OSX和iOS程序最適合,最受支持,最簡便的編程語言.


SwiftAwesomeness

正如上圖,這就是未來Swfit的趨勢,那你又能做什么來從Swift方式開始呢?


Swift方式

有許多方面需要考慮,但我們先討論下兩大內容: 安全性值語義.

安全性

Nil是Objective-C中很棒的存在:你可以發消息給nil,系統運行時會不會Crash,繼續保持響應.
<p>然而Swift中的nil是很不一樣的,通常其類型機制會阻止你試圖使用nil調用方法或者訪問一個內容為nil的屬性.雖然你可以避開這個類型機制,但這樣做就如同在C語言中使用指向null的指針一樣糟糕:你將容易在運行時掉入陷阱,使你的應用Crash.</p>
<p>在Swift中,所有都是類型安全的.一個String類型的字符串就是字符串,且不會為nil.理解上類似于C++的引用而不是C中的指針,因為它們永遠不會為nil.</p>

可選變量

在可選變量中,nil是可以使用的.一個可選類型的字符串變量可以是一個字符串,也可以為nil.你每次都要檢查是什么.不然你可以強制解包這個可選變量,或者改變它成一個隱式解包的可選變量,這意味著成為一個可選類型但表現跟一個真正的值一樣,一旦它是nil,這個app就會Crash


unwarp

<p>Cocoa里充滿了可選類型的變量,這代表著每次你所持有的數據,都不得不檢查內部真正的內容</p>
<p>這在想法上是一個巨大的提升,你要明白不應該有機會向nil發送消息.在一個強類型語言機制里,要么它是nil,要么就是某個值.如果它在程序運行時未知的,就需要檢查,不要試著強制解包它</p>

<p>將可選變量想做一個箱子:箱子里可以什么都沒有(為nill),也可以有個值.但你在解包或者拆箱這個可選變量之前總是需要檢查它,就像你會問在這個可選變量內部到底是什么?</p>
box

<p>在Swift已經有大量的其他例子顯示了Swift語言的安全性:初始化方法,更少未定義的行為,內存安全.Nil安全是Swift語言面世以來相當常見的對語言安全性的體現.</p>

值類型

值類型在Swift隨處可見.顯而易見,Obejctvie-C有著像NSInteger的基本數據類型,和像CGRect結構體.但是許多像NSString,NSArray等等都是類,為引用類型.
<p>在Swfit中,一個完全不同的地方就在于它的標準庫都有超過80個結構體,只有4個類,可以通過瀏覽頭文件看到.</p>
<p>字符串,數字,集合這些類型在Swift都是值類型.這就意味著如果你有一個可變的Swfit字符串,把它傳入一個函數,你將得到的是字符串的拷貝.再次說明下,這可不是一件糟糕的事:我們在一直使用Objective-C中,有copy和mutableCopy.這對于多數普遍類型的新默認行為是一個巨大的提升.</p>

橋接

Swift被設計出來當然要能與Objective-C很好協同工作,由于Cocoa是為Objective-C建立的,所以這是很有必要的.所有這些Cocoa APIs 幾乎都能被Swfit調用,這意味著你自定義的Objective-C類也能很好橋接到Swift類<p>這里就有問題出現了:以Swift開始,添加Objective-C,如何正像期望一樣調用從Objective-C橋接到Swfit方法</p>

Swift 到 Objective-C

Swiftz中有許多特性比如原生的結構體,加強的枚舉等等,不能完全地橋接到Objective-C,這就意味著你使用Swift最新特性來寫最新和最好的Swift框架,許多框架你就不能在Objective-C上使用.
<p>即使你限制自己只用Swift一些能兼容的特性寫程序,你也不能讓Swift的類繼承自Objective-C的類.你可以借鑒table views或collection views的模式,使用代理和布局對象來解決這個問題,但你要始終記得如果你Swfit的API需要繼承,默認在Objective-C不可見的.</p>
<p>如果你用@objc
標記了你的類和協議,那么他們在Obejctive-C在就是可用的.dynamic
修飾符也顯示使用了@objc
使得在Objective-C語言上可用,但它也使得你所限定的屬性或者方法使用了Objective-C動態分發.</p>


Swift 到 Objective-C

如果你想要使用swizzle或者其他動態特性,你將需要使用dynamic
標識符,僅僅@objc
不能保證它是使用objc_msgSend()
方法使得可能方法仍是編譯過的或者內聯的.
再一次強調:只有具有兼容性的特性才能工作.如果你在Swfit枚舉對象中實現一個方法,它不會橋接過去,如果你的枚舉存儲不是int而是其他類型,它也不會橋接過去.

Objective-C 到 Swift: Nullability

Objective-C轉向Swift有許多好的方面來優化.你給在Objective-C中屬性,參數,和返回值的類型添加標注.
_Null_unspecified(default)

  • 橋接為一個在Swift顯示解包的可選值

_Nonnull

  • 變量值不會為nil;橋接為一個常規的引用

_Nullable

  • 變量值可以為nil;橋接為一個可選變量

如果你標注了你Obejctive-C代碼, 在Swift中將會有很好的類型轉變.即使你沒有接觸過Swfit,當你寫Objective-C時這些標注會在你代碼完成后出現.并且如果你聲明一個方法參數為_Nonnull
而你傳入了nil,你就會得到一個編譯警告.
這是很好的練習來開始添加這些標注.在你使用已存在的API時會有所有幫助,讓你更容易地開始使用Swfit.

Objective-C 到 Swift: Lightweight Generics

輕量泛型是Swfit2新出來的特性.那些NSArray,NSDictionary,NSSet能存儲任何原來的NSObject對象的集合類型需要大量的轉換.在Objective-C中不會出現這樣的問題,但記得在Swfit的所有都安全相關,正確的轉換需要大量的類型檢查.你應該先檢測類型,而不是強制轉換.
現在有了泛型,這意味著你寫的Objective-C代碼會是這樣的:
NSArray<NSString *> * _Nonnull
這是一個將存儲NSString對象的NSArray.有著Nullability標注,你會明白這數組本身不能為nil;你將總能得到一個數組.如果你之前寫過Java或C++你應該會熟悉這樣的泛型寫法.
<p>而這個橋接到Swfit后會是這個樣子的:[String]
一個簡潔的Swfit的存儲String的數組.
<p>小小的提醒: 輕量泛型只對基礎集合的array, dictionary, sets 起作用

需要跨的坑

我簡易完全用Swfit開始新項目,如果你需要第三方庫,這不會影響你用Swfit還是Obejctive-C,你都能調用.如果你已經有了存在的項目代碼,想開始引入Swfit代碼,嘗試Obejctive-C向Swfit方法的保證橋接.例如已經實例化的視圖控制器,視圖在Swfit工作正常;它們都起源于NSObject,所以需要的話你能訪問它們通過Objective-C.


Bridge

還有其他方面:Swfit泛型,枚舉的存儲不僅僅是整型,內嵌類型,結構體等等,這些需要等到你完全入門100%Swift,不要灰心,那天會比你所想的提前到來.
<p>在那之前,繼續友好地使用Obejctive-C,做好使用Swfit的準備.下面資源可以幫助你完成這一轉變.

Resources

What's New in Swift 2 – get up to date on the latest stuff in Swift 2
Swift Guard Statement – someone asked a question about keeping code in the "happy path", which the new guard statement in Swift 2 helps with!
Introducing Protocol-Oriented Programming in Swift 2 – Protocol-oriented programming is the new hotness in Swift.
Using Swift with Cocoa and Objective-C (Swift 2 Prerelease) – Apple's book on Swift + Objective-C + Cocoa

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,245評論 4 61
  • 上圖,最左側的部分,是純粹技能,不需要任何運氣成分(比如圍棋);最右側的部分是純粹的運氣,不需要任何技能(比如拋硬...
    RomainLiu閱讀 286評論 0 2
  • 室友是個很漂亮的姑娘,大大的眼睛,小小的嘴巴,長得屬于甜美可愛類型的。她男朋友對她很好,什么事都是她男朋友安排...
    忘君七年閱讀 232評論 0 1