Swift 3必看:foundation中數據引用類型改為值類型

注重安全的swift中變量聲明時要表明是否可變,不變用<code>let</code>,可變用<code>var</code>。然而由于swift設計之初就要考慮兼容OC的這個歷史包袱,很多類型都沿用了OC的類型。只有幾個基礎類型重寫聲明成了值類型(struct),比如:<code>String</code>,<code>Array</code>。

引用類型的<code>let</code>和值類型的<code>let</code>在邏輯上有著根本的不同。值類型的不可變就如字面意義,數據不能被更改;而引用類型的不可變只要保證指向的實例不變就可以了,實例本身的屬性是可以改變的。

一些原有的OC的foundation表示數據的引用類型在swift的行為就和期待的不同了,比如:

let date = NSDate()
date.addingTimeInterval(1000)

這樣的寫法是可以編譯通過的。然而確和我們期望的結果不同。我們聲明了一個不可變的日期,然而在<code> addingTimeInterval </code>后日期已經被改變了。

所以在3.0中把原有的很多表示數據的引用類型在增加了對應的值類型。
更改的如下:

Value Type Class Type
AffineTransform NSAffineTransform
CharacterSet NSCharacterSet, NSMutableCharacterSet
Date NSDate
DateComponents NSDateComponents
Data NSData, NSMutableData
IndexSet NSIndexSet, NSMutableIndexSet
IndexPath NSIndexPath
Notification NSNotification
PersonNameComponents NSPersonNameComponents
URL NSURL
URLComponents NSURLComponents
URLQueryItem NSURLQueryItem
UUID NSUUID

在swift中相關的api返回類型也做了對應的更改。比如常見的<code> cellForRow </code>方法:

func cellForRow(at indexPath: IndexPath) -> UITableViewCell?

原來的參數類型是NSIndexPath,現在則改為了IndexPath。

和原來的OC的類型映射和原來的邏輯一樣,類型轉換直接使用<code> as </code>

let ocString = NSString(string: "xxx")
let swiftString: String = ocString as String

let swiftIndex = IndexPath(row: 1, section: 1)
let ocIndex = swiftIndex as NSIndexPath

需要強調的是,兩者之間的轉換是有成本的。swift中并沒有真正完全的實現一套數據存儲邏輯。只是內部保存了對oc對象的引用,使得swift api訪問時行為邏輯和值類型一致,包括copy on write。

如下圖所示,當執行<code> var otherData = data </code>后,其實指向的是同一個引用類型的實例。

歡迎關注我的微博:@沒故事的卓同學

相關鏈接:
SE0069-Mutability and Foundation Value Types

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

推薦閱讀更多精彩內容

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,881評論 1 10
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,241評論 4 61
  • Swift 介紹 簡介 Swift 語言由蘋果公司在 2014 年推出,用來撰寫 OS X 和 iOS 應用程序 ...
    大L君閱讀 3,301評論 3 25
  • 起初 我的心如鄉村般 生活在純樸、自然的平凡里 歡聲笑語 也許 那一年的成長 天花亂墜 那一年的青春 繁華落盡 之...
    趙江灝閱讀 592評論 0 1
  • 如果你不曾遠去 定會是我的歡喜 快樂隨你遠去 我帶著相思追憶 絲絲縷縷 絲絲縷縷 密集成雨 乘著回憶的小船 劃回...
    汩月閱讀 252評論 0 0