func myFunction() -> NSData { ... }
意味着myFunction
返回NSData
一个实例。上述
func myFunction() -> NSData? { ... }
意味着myFunction
返回Optional<NSData>
型(也称为NSData?
)的值。 Optional
是enum
,有两种情况:.some(value)
和.none
(也称为nil
)。因此该函数返回NSData
(包装在.some
的情况下)或nil
。上述
func myFunction() -> NSData! { ... }
意味着myFunction
返回Optional<NSData>
类型,就像在前面的例子中NSData?
返回类型的值。
但是,使用!
意味着,如果您使用myFunction()
的值的方式不进行类型检查,编译器会尝试为您打开返回的值。所以,如果你这样说:
let maybeLength = myFunction()?.length
那么编译器会看到,你是治疗的myFunction
返回值作为Optional<NSData>
。但是,如果你这样说:
let dataLength = myFunction().length
那么编译器会看到Optional<NSData>
没有length
成员,因此它会假装你写了这个:
let dataLength = myFunction()!.length
,如果可以编译,它会继续。
此行为在Swift Evolution proposal SE-0054, Abolish ImplicitlyUnwrappedOptional
type中定义。
现在我们终于可以这样考虑:
func myFunction() -> NSData! { ... }
let data = myFunction()
data?.write()
什么是data
类型?编译器必须根据=
右侧的表达式推断出data
的类型。正如我在上面的例子中解释的那样,myFunction()
的类型是Optional<NSData>
。所以data
的类型是Optional<NSData>
,也叫NSData?
。
编译器没有遇到任何问题,使得data
的类型为NSData?
,所以它没有理由隐式地解开返回值myFunction
。
可能是重复https://stackoverflow.com/questions/24061039/how-is-a-return-value-of-anyobject-different-from-anyobject – rmaddy
对于'NSData',这两者之间没有什么不同两行代码。你可以在@rmaddy发送的链接中找到Rob的一个很好的解释。 – Lawliet
在实践中**从不**使用隐式展开的可选值作为函数/方法中的返回类型。这个值可以是'nil',然后使用'?'或者该值永远不会'nil',然后使用'non-optional'。 – vadian