gpt4 book ai didi

swift - 强制解包返回类型?

转载 作者:搜寻专家 更新时间:2023-11-01 05:56:03 24 4
gpt4 key购买 nike

我开始关注可选值和强制展开,除了在一个特定的上下文中:当它是函数的返回类型时。

有什么区别:

func myFunction() -> NSData { ... }

func myFunction() -> NSData! { ... }

func myFunction() -> NSData? { ... }

此外,当我使用 NSData! 的返回值时,我被迫使用 ? 这看起来很奇怪。

func myFunction() -> NSData! { ... }
let data = myFunction()
data?.write()

为什么我需要 如果我强制打开返回值?

最佳答案

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 的返回值.

关于swift - 强制解包返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44712828/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com