多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > [Swift]Day17:可選類型

[Swift]Day17:可選類型

來源:程序員人生   發布時間:2014-12-16 09:04:58 閱讀次數:2819次

可選類型

(對可選類型的理解可以參見貓神的這篇行走于 Swift 的世界中,在此整理1些關鍵的部份。)

Optinal Value

Swift 中的 Optinal Value 就像是1個盒子,可能裝著值,也可能甚么都沒裝。

我們可以用 ? 定義1個可選類型的整數 :

var num: Int? num = nil //nil num = 3 //{Some 3}

可選類型的真實身份實際上是 Optional 類型,經常使用的 ? 是 Apple 提供的語法糖。使用 Optional 的寫法是這樣的:

var num: Optional<Int> num = Optional<Int>() // nil num = Optional<Int>(3) // {Some 3}

點進去看下 Optional 的定義:

enum Optional<T> : Reflectable, NilLiteralConvertible { case None case Some(T) /// Construct a `nil` instance. init() /// Construct a non- `nil` instance that stores `some`. init(_ some: T) /// If `self == nil`, returns `nil`. Otherwise, returns `f(self!)`. func map<U>(f: (T) -> U) -> U? /// Returns a mirror that reflects `self`. func getMirror() -> MirrorType /// Create an instance initialized with `nil`. init(nilLiteral: ()) }

這樣1來,var num: Int? = 3 其實就是 Optional.Some(3)

在這里,? 聲明了1個 Optional<T> 類型的變量,然后做了判斷:

  • 如果等號右側是 nil ,則賦值為 Optional.None
  • 如果等號右側不是 nil ,則通過 init(_ some: T) 初始化并返回 Optional.Some(T) 。

Force Unwraps

在遭受可選類型的時候,我們可以在 Optional 變量后面加上 ! 進行強迫解包。這樣雖然減少了代碼量,但是容易帶來隱患,使用的時候務必要慎重。就像是過馬路1樣,1定要仔細看好兩邊車輛,否則悲劇隨時可能產生。

而實際上,很多時候可以免使用 ! ,用其他方法取而代之。

來看這樣1個例子:

let ages = [ "Tim": 53, "Angela": 54, "Craig": 44, "Jony": 47, "Chris": 37, "Michael": 34, ] let people = sorted(ages.keys, <).filter { ages[$0]! < 50 } println(people) // "[Chris, Craig, Jony, Michael]"

在這里先對 ages 進行了排序,然后挑選出年紀小于 50 的人。由于是對字典取值,會出現 nil ,所以 ages[$0] 是 optional 的,需要進行解包。

固然也能夠用 if let :

let people = sorted(ages.keys, <).filter { if let age = ages[$0] { return age < 50 } return false; }

但是本來1行就可以弄定的問題卻拖沓到了5行才解決。實際上,換個思路,我們完全不需要遭受可選類型:

let people = filter(ages) { $0.1 < 50 }.map { $0.0 }.sorted(<)

filter 中 $0 表示傳入的 key-value ,$0.1 表示 value,map 中 $0 表示傳入的 key-value ,$0.0 表示 key 。也許這樣可讀性比較差,可以通過 tuple 包裝1下入參:

let people = filter(ages) { (k,v) in v < 50 }.map { (k,v) in k }.sorted(<)

在平時的開發中,我們可以用 if let 或 ?? 替換掉 ! 。如果確切確切肯定不會出問題再去用 ! 。

Implicitly Unwrapped Optionals

一樣是 ! 符號,如果放在類型后面,則表示隱式解析可選類型 (Implicitly Unwrapped Optionals):

var num: Int! num = 1 // 1 num = nil // nil

通過 ! 定義的變量,實質上只是對 Optional 的變量多了1層封裝,幫我們完成了本來需要手動解包的進程。

在甚么場合下可使用隱式解析可選類型呢?

場景1:沒法在初始化方法中定義的常量

有些為難的情況,我們想定義常量屬性,無奈它的初始化依賴于其他屬性值。如果你用可選類型,實在是麻煩,由于你確信無疑它肯定會在調用之前就完成初始化,不多是 nil ,這個時候你可以用 ! 進行定義。

舉個例子:

class MyView : UIView { @IBOutlet var button : UIButton var buttonOriginalWidth : CGFloat! override func viewDidLoad() { self.buttonOriginalWidth = self.button.frame.size.width } }

這部份內容在 Day11 中有觸及,其實更好的方法是用 lazy 延時加載,不再贅述。

場景2:與 objc 進行交互

隱式解析可選類型仿佛是為了照顧 objc 這個歷史包袱而存在。比如 UITableView 中:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? { return nil }

我們很清楚的知道,在調用的時候 tableView 和 indexPath 不可能為 nil ,如果還要 if let 這樣解包實在是浪費時間。如果是純潔的 Swift 語言寫的,絕對不會定義成 optional 類型。

甚么時候不該用

除上述的情況2 ,其他情況都不該用 (包括情況1)。


References

  • Running Totals and Force Unwraps
  • Uses for Implicitly Unwrapped Optionals in Swift
  • Walk in Swift
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: www日| 亚洲国产成人精品一区二区三区 | 一本大道香蕉中文日本不卡高清二区 | 一级欧美日韩 | 中文字幕一区二区三区四区五区 | 偷自拍第一页 | 欧美福利视频在线 | yellow日本 | 国产永久在线视频 | 成片免费观看视频在线网 | 午夜视频www | 在线观看视频一区二区 | 国产麻豆精品在线观看 | 国产在线不卡一区 | 国内精品久久久久影院中国 | 久久一区二区三区精品 | 五月婷婷免费视频 | 日本.www| 可以免费看黄色的网站 | 亚洲精品h | 最新激情网站 | 日韩理论片在线看免费观看 | 日本三区视频 | 琪琪理论影院2018中文版 | 国产精品久久久久久久久久直 | 成年香蕉大黄美女美女 | 女人18毛片特级一级免费视频 | 亚洲一区欧美 | 韩国精品一区二区久久 | 国产一区二区精品久久91 | 亚洲精品一区二区三区不卡 | 国产欧美在线视频免费 | 2022国产成人精品福利网站 | xxx性日本 | 日韩视频高清 | 性欧美一级毛片 | 色福利在线 | 国产www视频| 久久亚洲欧洲日产国码 | 亚洲精品欧美精品中文字幕 | 成人久久精品一区二区三区 |