2015-02-17 40 views

回答

4

這是選項背後的語法糖的一部分。指定非可選值是如何將包裝在可選類型中。

由於可選項表示存在或不存在值,因此不應該做任何特殊的操作來指示存在除提供值之外的值。例如,在一個函數:

func gimmeSomethingMaybe() -> String? { 
    if arc4random_uniform(10) > 7 { 
     return "something" 
    } else { 
     return nil 
    } 
} 

試想一下,如果每次你想從一個功能是能夠返回零返回一個真正的價值的時候,你必須寫return Optional(value)。那會變得很快,對吧?可選項是語言的一個重要特徵 - 儘管它們實際上是由標準庫實現的,但語法糖/自動包裝可以避免繁瑣的使用它們。


編輯:只是爲了走得更遠一點到這...糖也有助於實施的概念,一個真正的價值不宜選用。例如:

let one = 1 
one? // error (in Swift 1.2, allowed but meaningless in Swift 1.1) 
"two"? // error (ditto) 

您可以創建一個可選的包裝與Optional(one)初始化一個真正的價值,但有一點語義上自己的,所以你幾乎從來沒有需要。

當關於值是否存在 - 也就是說,當一個程序的一部分是否接收到一個值(或沒有值)取決於該部分的未知狀態存在「神祕」時,選項應該發揮作用該程序。如果你知道你有一個真正的價值,那就沒有什麼神祕感......相反,你讓未知物在知道價值的代碼和不知道的代碼之間的邊界上發揮作用 - 也就是函數/方法/屬性定義將該值傳遞給某個地方。

+0

我問題被正確標記爲重複。我瞭解除了一部分以外的所有內容。你能迴應我的問題的最後一段從[這裏](http://stackoverflow.com/questions/41291433/why-can-you-assign-an-non-optional-to-an-optional-without-any -錯誤) – Honey 2016-12-22 21:08:19

0

讀完rickster的回答後,我想出了一個簡單的外行術語答案。對我來說,他的回答全整個要點是

由於可選的指示值的存在或不存在,你 不應該做什麼特別的指示以外的 值的存在不是提供一個

可選是一個枚舉。其中有2例a或b。

         String? 
             | 
           An enum with 2 cases 
             |        
           a    b 
           |    | 
           Set   notSet 
           |    | 
         any value like "hi"  nil 

所以你可以做任何事情,當你想分配給可選。

說出值是:

  • 一個:它被設置爲「Hi」
  • B:它沒有設置,所以它的nil
  • C:它只是相當於另一個枚舉即另一個可選

代碼:

var str : String? 
var anotherOptional : String? 

str = nil // nil <-- this is like case b 
str = "hi" // "hi" <-- this is like case a 

str = anotherOptional // nil <-- this is like case c 

anotherOptional = "hi again" 
str = anotherOptional // "hi again" <-- this is like case c 
相關問題