tuple - swift type inference




“as?”,“as!”和“as”之間有什麼區別? (2)

as

在Swift 1.2及更高版本中, as只能用於上傳 (或消除歧義)和模式匹配

// 'as' for disambiguation
let width = 42 as CGFloat
let block = { x in x+1 } as Double -> Double
let something = 3 as Any?  // optional wrapper can also be added with 'as'


// 'as' for pattern matching
switch item {
case let obj as MyObject:
    // this code will be executed if item is of type MyObject
case let other as SomethingElse:
    // this code will be executed if item is of type SomethingElse
...
}

as?

條件轉換運算符as? 嘗試執行轉換,但如果不能,則返回nil 。 因此,其結果是可選的。

let button = someView as? UIButton  // button's type is 'UIButton?'

if let label = (superview as? MyView)?.titleLabel {
    // ...
}

as!

as! 運算符用於強制類型轉換。

僅當您確定向下轉換將始終成功時,才使用類型轉換運算符的強制形式( as! )。 如果您嘗試向下轉換為不正確的類類型,則此形式的運算符將觸發運行時錯誤

// 'as!' for forced conversion.
// NOT RECOMMENDED.
let buttons = subviews as! [UIButton]  // will crash if not all subviews are UIButton
let label = subviews.first as! UILabel

在我升級到Swift 1.2之前,我可以編寫以下行:

if let width = imageDetails["width"] as Int?

現在它迫使我寫下這一行:

if let width = imageDetails["width"] as! Int?

我的問題是,如果我被迫按上述方式編寫,我不能只編寫下面的代碼,它會做同樣的事情嗎? 它會在imageDetails的所有值中給出相同的結果嗎?

if let width = imageDetails["width"] as Int

as關鍵字用於執行upcast和downcast:

// Before Swift 1.2
var aView: UIView = someView()

var object = aView as NSObject // upcast 

var specificView = aView as UITableView // downcast

從派生類到基類的upcast可以在編譯時檢查,永遠不會失敗。

但是,由於您無法始終確定特定的類,因此向下轉換可能會失敗。 如果你有一個UIView,它可能是一個UITableView或UIButton。 如果你的墮落者去了正確的類型 - 太棒了! 但是,如果您碰巧指定了錯誤的類型,則會出現運行時錯誤,應用程序將崩潰。

在Swift 1.2中,downcast必須是可選的as? 或“強制可以”與! 如果你確定類型,那麼你可以強制演員! 類似於如何使用隱式解包的可選項:

// After Swift 1.2
var aView: UIView = someView()

var tableView = aView as! UITableView

感嘆號清楚地表明你知道自己在做什麼,而且如果你不小心混淆了你的類型,那麼事情就會出現嚴重錯誤!

一如既往? 使用可選綁定是最安全的方法:

// This isn't new to Swift 1.2, but is still the safest way
var aView: UIView = someView()

if let tableView = aView as? UITableView {
  // do something with tableView
}

從一個網站得到這個: SOURCE





casting