2015-10-15 161 views
-1

例如快速可選類型中的`!`&`?`運算符有什麼區別?

class Person { 
    let name: String 
    init(name: String) { self.name = name } 
    var apartment: Apartment? 
    deinit { print("\(name) is being deinitialized") } 
} 

class Apartment { 
    let number: Int 
    init(number: Int) { self.number = number } 
    var tenant: Person? 
    deinit { print("Apartment #\(number) is being deinitialized") } 
} 

var john: Person? 
var number73: Apartment? 

john = Person(name: "John Appleseed") 
number73 = Apartment(number: 73) 

john?.apartment?.tenant?.name 

john!.apartment = number73 
number73!.tenant = john 

//john?.apartment = number73 
//number73?.tenant = john 

john?.apartment?.tenant?.name 

看來john?.apartment = number73john!.apartment = number73都工作,什麼是這兩者的差異,在這種情況下,哪一個是首選?非常感謝。

+0

可能重複[字符串有什麼區別?和字符串! (兩種創建可選變量的方法)?](http://stackoverflow.com/questions/24083842/what-is-the-difference-between-string-and-string-two-ways-of-creating-an- OPTI) –

回答

3

案例john?.apartment = number73

  • 如果johnnil,什麼也不做(相同信息發送到nil在Objective-C)
  • 如果johnnil,分配數量。

案例john!.apartment = number73

  • 如果johnnil,提高又名崩潰運行時錯誤(著名的錯誤:致命錯誤:意外發現零而展開的可選值
  • 如果john是不是nil,請指定號碼。

如果可以確保john不是nil,請使用感嘆號。
如果john可能是nil,請使用問號。

1

它們之間的區別在於,如果鏈中的任何屬性都是nil?將僅返回nil。使用!時,如果其中一個值爲nil,程序將會崩潰。

0

簡單地想象一下嗎?作爲一個封閉的盒子,它可以有一個值或具有在其內部無(無),示例於:

let number: Int = 3 

數是一個整數值,是是一個封閉的3

let number: Int? = 3 

數可能包含整數值的框4

該!迫使箱子(?)給你一個價值,當你100%確定有價值時它會被使用,否則它會崩潰。

這個!也用於檢查盒子是否有數值或不喜歡:

if number! = 3 { 

    do stuff 
} 

儘量不要使用!儘可能多因爲有一個很大的機會,會給你崩潰

希望幫助:)

相關問題