作者:手机用户2502929925 | 来源:互联网 | 2023-01-31 14:31
我开始关注选项并强制解包,除了在一个特定的上下文中:当它是函数的返回类型时.
有什么区别:
func myFunction() -> NSData { ... }
func myFunction() -> NSData! { ... }
func myFunction() -> NSData? { ... }
此外,当我使用返回值时NSData!
,我被迫使用?
看似奇怪的.
func myFunction() -> NSData! { ... }
let data = myFunction()
data?.write()
为什么我需要?
如果我强行打开回报?
1> rob mayoff..:
func myFunction() -> NSData { ... }
上面的意思是myFunction
返回一个实例NSData
.
func myFunction() -> NSData? { ... }
上面的方法myFunction
返回一个类型的值Optional
(也称为NSData?
).Optional
是一种enum
具有两种情况:.some(value)
和.none
(也称nil
).所以函数返回一个NSData
(包装在.some
case中),或者nil
.
func myFunction() -> NSData! { ... }
上面的方法myFunction
返回一个类型的值Optional
,就像NSData?
前一个例子中的返回类型一样.
但是,使用!
意味着,如果以不使用myFunction()
类型检查的方式使用值,编译器将尝试为您解包返回的值.所以,如果你这样说:
let maybeLength = myFunction()?.length
然后编译器会看到你正在将返回值myFunction
视为一个Optional
.但如果你这样说:
let dataLength = myFunction().length
然后编译器会看到Optional
没有length
成员,所以它会假装你写了这个:
let dataLength = myFunction()!.length
如果编译,它将继续.
此行为在Swift Evolution提案SE-0054,Abolish ImplicitlyUnwrappedOptional
类型中定义.
现在我们终于考虑一下:
func myFunction() -> NSData! { ... }
let data = myFunction()
data?.write()
是什么类型的data
?编译器必须data
根据右侧的表达式推断出类型=
.正如我在上面的例子中解释的那样,类型myFunction()
是Optional
.所以类型data
是Optional
,也称为NSData?
.
编译器不会碰到作出任何麻烦data
的类型NSData?
,所以没有理由暗示解开的返回值myFunction
.