2015-10-15 160 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 
} 

尽量不要使用!尽可能多因为有一个很大的机会,会给你崩溃

希望帮助:)

相关问题