什么是`!`和& `?`运算符是swift可选类型的?

时间:2015-10-15 15:18:04

标签: swift

例如

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都有效,这两者的区别是什么,在哪种情况下,哪一个是首选的?非常感谢。

3 个答案:

答案 0 :(得分:3)

案例john?.apartment = number73

  • 如果johnnil,则不执行任何操作(与在Objective-C中向nil发送消息相同)
  • 如果john不是nil,请指定号码。

案例john!.apartment = number73

  • 如果johnnil,则引发运行时错误,即崩溃(着名错误:致命错误:在展开可选值时意外发现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
}

尽量不要使用!同样多,因为有很大机会让你崩溃

希望有所帮助:)