Swift编程语言指南中有如下示例:

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

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

var john: Person?
var number73: Apartment?

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

//From Apple's “The Swift Programming Language” guide (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

然后,在给这个人分配公寓时,他们使用感叹号来“打开实例”:

john!.apartment = number73

“展开实例”是什么意思?为什么有必要?它与仅仅做以下事情有什么不同:

john.apartment = number73

我对Swift语言很不熟悉。我只是想把基本的东西记下来。

更新: 我遗漏了一个很大的谜团(答案中没有直接说明——至少在写这篇文章的时候没有),那就是当你做以下事情的时候:

var john: Person?

这并不意味着“约翰是人的类型,它可能是nil”,因为我最初的想法。我只是误解了《人与人》是完全不同的类型。一旦我明白了,所有其他的?,!疯狂,以及下面这些精彩的回答,让我觉得更有道理。


当前回答

简单地说

USING感叹号表示变量必须包含非nil值(它永远不会是nil)

其他回答

下面是一些例子:

var name:String = "Hello World"
var word:String?

其中word是可选值。意味着它可能包含或不包含某个值。

word = name 

这里name有一个值,所以我们可以给它赋值

var cow:String = nil
var dog:String!

狗被强制打开意味着它必须包含一个值

dog = cow

应用程序将崩溃,因为我们将nil赋值给unwrapped

!在对象的末尾表示该对象是可选的,如果它可以返回nil则展开。这通常用于捕获错误,否则会使程序崩溃。

总之(!): 在你声明了一个变量并且你确定这个变量有一个值之后。

let assumedString: String! = "Some message..."
let implicitString: String = assumedString

否则你必须在每次传递值之后都这样做…

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

简单地说,感叹号意味着一个可选选项正在被打开。可选变量是一个可以有值也可以没有值的变量——因此,您可以使用如下所示的if let语句检查变量是否为空,然后强制展开它。如果你强制打开一个空的可选选项,你的程序会崩溃,所以要小心!可选项是通过在变量的显式赋值后面加一个问号来声明的,例如我可以这样写:

var optionalExample: String?

这个变量没有值。如果我要打开它,程序会崩溃Xcode会告诉你你试图打开一个值为nil的可选对象。

希望这有帮助。

在这种情况下……

John:人!

它意味着,最初John的值为nil,它会被设置,一旦设置,就不会再以nil为先导。因此,为了方便起见,我可以使用更简单的语法来访问可选变量因为这是一个隐式展开的可选变量