回想一下Array
's first
method返回一个可选内容。下面给出警告,它隐式强制了可选项,因此,这可能是一种不好的做法:
let names = ["Bob", "Alice"]
let x = names.first
print(x)
// Warning: Expression implicitly coerced from 'String?' to 'Any'
但是,example in the Apple Swift docs for closures的简化看起来似乎是等效的,并且不会发出警告。
var closures: [() -> Void] = []
closures.append {print("Hello from the first closure in the list!")}
closures.append {print("Hello from the second closure in the list!")}
// Implicitly coerce the closure
closures.first?()
// Printed: Hello from the first closure in the list!
除了一个是可选的String另一个是可选的闭包以外,这些不是“相同的”吗?因为它在Swift的官方文档中,并且没有引发任何错误,所以我相信这是可以的用法。我想念什么?
编辑:感谢您的回复!我想我现在明白了。类似于第一个示例的示例将更像是:
var closures: [() -> String] = []
closures.append {"Hello from the first closure in the list!"}
print(closures.first?())
这确实给出了相同的警告,因为optional chaining返回一个可选内容,即使闭包没有。