例如
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 = number73
和john!.apartment = number73
都有效,这两者的区别是什么,在哪种情况下,哪一个是首选的?非常感谢。
答案 0 :(得分:3)
案例john?.apartment = number73
john
为nil
,则不执行任何操作(与在Objective-C中向nil
发送消息相同)john
不是nil
,请指定号码。案例john!.apartment = number73
john
为nil
,则引发运行时错误,即崩溃(着名错误:致命错误:在展开可选值时意外发现nil )john
不是nil
,请指定号码。如果可以确保john
不是nil
,请使用感叹号
如果john
可以是nil
,请使用问号。
答案 1 :(得分:1)
它们之间的区别在于,如果链中的任何属性为?
,nil
将只返回nil
。使用!
时,如果其中一个值为nil
,则程序将崩溃。
答案 2 :(得分:0)
简单地说想象一下?作为一个封闭的盒子,它可以有一个值或者里面没有任何东西(零),这是一个例子:
let number: Int = 3
number是一个3
的整数值let number: Int? = 3
number是一个封闭的框,可能包含整数值4
!是强制框(?)给你一个值,当你100%确定它有价值时使用它,否则它会崩溃。
!还用于检查框是否具有值:
if number! = 3 {
do stuff
}
尽量不要使用!同样多,因为有很大机会让你崩溃
希望有所帮助:)