2017-03-24 33 views
1

我是新的swift.When我聲明一個變量,或者當我得到一個實例的屬性時,我發現「!」和「?」在Objective-C中做這樣的事情很容易,你甚至不知道具有「id」類型的類的類型。爲什麼我們需要!?如何理解swift中的`!`和`?`?

代替

我想知道設計!?的原因,如何使用them.What是具有可選類型的優勢?

+3

你應該google一下'Optional'在迅速,有很多關於它的文章 – JuicyFruit

+0

我建議蘋果文件https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID309。 var用'?'聲明可能有也可能沒有任何價值。聲明的var實例可能是'零'值。 '!'用於確保declare var具有非零值或用值初始化的標記。你可以考慮'!'它表示您擁有聲明變量的責任,並且具有非零值。 –

+0

閱讀下面的答案; - http://stackoverflow.com/questions/24083842/what-is-the-difference-between-string-and-string-two-ways-of-creating-an-opti –

回答

3

嗯......

? (Optional)表明您的變量可以包含一個零值,而! (unwrapper)表示您的變量必須有一個存儲器(或價值)時使用它(試圖得到一個值從它)在運行時。

主要區別在於,當可選爲零時,可選鏈優雅地失敗,而當可選爲零時,強制解包會觸發運行時錯誤。

爲了反映可選鏈接可以在nil值上調用的事實,即使正在查詢的屬性,方法或腳標返回非選項值,可選鏈接調用的結果也始終爲可選值。您可以使用此可選返回值來檢查可選的鏈接調用是否成功(返回的可選值包含值),或者由於鏈中的零值(返回的可選值爲零)而不成功。

具體而言,可選鏈接調用的結果與預期返回值具有相同的類型,但包含在可選項中。通常返回一個Int的屬性將返回一個Int?通過可選鏈接訪問時可以使用

var defaultNil : Int? // declared variable with default nil value 
println(defaultNil) >> nil 

var canBeNil : Int? = 4 
println(canBeNil) >> optional(4) 

canBeNil = nil 
println(canBeNil) >> nil 

println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper 

var canNotBeNil : Int! = 4 
print(canNotBeNil) >> 4 

var cantBeNil : Int = 4 
cantBeNil = nil // can't do this as it's not optional and show a compile time error 

Here is basic tutorial in detail, by Apple Developer Committee.

+3

隱式解包的可選*可*爲零... –

3

Apple文檔:

你在一個值可能是不存在的情況下使用自選。 可選表示兩種可能性:或者有一個值,並且 可以打開可選項來訪問該值,或者完全不存在 值。

C或Objective-C中不存在optionals的概念。在Objective-C的 最近的事情是從 方法,否則將返回一個對象,以零意義返回無能力「的 沒有有效的對象。」

如果定義了一個可選的變量,而不提供默認值, 變量將自動設置爲無給你:

var surveyAnswer: String? 

是否可選包含通過比較鄰一 值可以使用if語句來找出對零的任意性。用「等於」運算符(==)或「不等於」運算符(!=)執行此 比較。

如果選購的具有價值,它被認爲是「不等於」零:

if convertedNumber != nil { 
print("convertedNumber contains some integer value.") 
} 

一旦你確定了可選確實包含一個值,你可以 通過將感嘆號(!)添加到可選名稱的 末端來訪問其基礎值。感嘆號有效地說:「我 知道這個可選肯定有一個值;請使用「強迫可選的值的展開這 被稱爲:

print("convertedNumber has an integer value of \(convertedNumber!).") 
相關問題