日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

[Swift]Day17:可選類型

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

可選類型

(對可選類型的理解可以參見貓神的這篇行走于 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
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 欧美日韩激情在线一区二区三区 | 久综合 | 日韩一级精品视频在线观看 | 国产精品久久久久久影视 | 懂色av一区二区三区蜜臀 | 欧美日韩v | 国产专区在线播放 | 欧美日韩亚洲在线观看 | 日本xxxxwwww | 一区二区三区日韩欧美 | 99精品99| 九九综合九九 | 欧美一区二区在线看 | 麻豆精品久久久 | 91先生在线观看 | 国产精品久久久久久久久 | 国产精品国产三级国产aⅴ入口 | 不卡中文一区 | 欧美日韩亚洲二区 | 久久三级| 国产视频在线一区二区 | 久久h | 成人激情视频在线 | 搞黄视频在线免费观看 | 岛国午夜视频 | 日韩福利| 久久一级精品视频 | 午夜精品久久久久久久久久久久久 | 欧美中文字幕在线 | 日本在线一区二区 | 日韩在线视频网站 | 好吊日精品视频 | 中文字幕无线精品亚洲乱码一区 | 视频一区国产精品 | 国产精品亚洲视频 | 日本三级黄 | 精品欧美一区二区久久久伦 | 欧美性受xxxx黑人xyx | 狠狠av | 国产h片在线观看 | 亚洲一区二区三区四区在线 |