我把握(我認爲)的optional types in Swift和連鰭鮭基本瞭解?
和!
之間的差別,但我仍然通過一些結果我得到的困惑,當我使用這些功能 - 尤其是Some <T>
的作用,以及如何它不同於<T>
本身;某些特定的錯誤消息,我在某些情況下得到;以及Some <T>
在我預期<T>
的情況下似乎彈出。「Rosetta Stone」是Swift的可選類型嗎?
但我也覺得,即使我明白個別情況下,我的畫面的把握變得離我而去,而我覺得這裏有一個代碼,我可以破譯,如果只有我完全瞭解一個簡單的例子 - 一個Rosetta Stone,如果你願意的話 - 對於!
,?
,可選值和解包。
這裏,例如,是一個簡單的和(我認爲)的基本情況詳盡的目錄:
class Foo {
var one:String = "";
var two:String?
var three:String!
}
let test = Foo() // {one "" nil nil}
test.one
//test.one? // ERROR: ? requires optional type
//test.one! // ERROR: ! requires optional type
// ?, unassigned
test.two // nil
test.two? // nil
//test.two! // ERROR: EXEC_BAD_INSTRUCTION
test.two == nil // true
test.two? == nil // true
//test.two! == nil // ERROR: Cannot invoke == with an argument list of type (@lvalue String, NilLiteralConvertable)
//test.two.isEmpty // ERROR: String? does not have .isEmpty
test.two?.isEmpty // nil
//test.two!.isEmpty // ERROR: EXEC_BAD_INSTRUCTION
// !, unassigned
test.three // nil
test.three? // nil
//test.three! // ERROR: EXEC_BAD_INSTRUCTION
test.three == nil // true
test.three? == nil // true
//test.three! == nil // ERROR: Cannot invoke == with an argument list of type (@lvalue String, NilLiteralConvertable)
//test.three.isEmpty // ERROR: EXEC_BAD_INSTRUCTION
test.three?.isEmpty // nil
//test.three!.isEmpty // ERROR: EXEC_BAD_INSTRUCTION
test.two = "???" // {one "" {Some "???"} nil}
test.three = "!!!" // {one "" {Some "???"} three "!!!"}
// ?, assigned
test.two // {Some "???"}
test.two? // {Some "???"}
test.two! // "???"
test.two == nil // false
test.two? == nil // false
//test.two! == nil // ERROR: Cannot invoke == with an argument list of type (@lvalue String, NilLiteralConvertable)
//test.two.isEmpty // ERROR: String? does not have .isEmpty
test.two?.isEmpty // {Some false}
test.two!.isEmpty // false
// !, assigned
test.three // "!!!"
test.three? // {Some "!!!"}
test.three! // "!!!"
test.three == nil // false
test.three? == nil // false
//test.three! == nil // ERROR: Cannot invoke == with an argument list of type (@lvalue String, NilLiteralConvertable)
test.three.isEmpty // false
test.three?.isEmpty // {Some false}
test.three!.isEmpty // false
如果有人能詮釋這一點,解釋每一種情況下這是怎麼回事呢,我認爲答案可能作爲Swift的這些功能如何工作的堅實參考。
注:我知道有很多的關於這個問題(和很多偉大的答案);我已經閱讀了所有內容。我在這裏尋找的東西有點不一樣:在一個簡單的例子的背景下,解釋規則如何在每個特定的情況下在一個地方展示出來。另外,這不是一個關於使用的問題;我想我會得到這些功能的原因。 – orome 2014-10-02 16:46:28