gpt4 book ai didi

ios - swift:强制类型修饰符 "!"- 为什么它在 UIKit API 中使用(现在不合时宜)

转载 作者:IT王子 更新时间:2023-10-29 05:21:05 25 4
gpt4 key购买 nike

编辑:这个问题的目的是理解隐式可选运算符“!”的使用。在早期的 UIKit API 更新中,特别是如果一个函数被声明为返回一个预期为非可选的类型,为什么要使用可选的,如果它是可选的,为什么不使用可选的“?”运算符(operator)。 “!”的语义虽然总是很清楚。

随着时间的推移,Apple 审核了 API 以使可选性更加精确,使用 ?对于真正的可选类型,并在它们实际上是非可选类型时使用非可选类型。这是对通常含糊不清的原始 Objective-C 签名的保留。


swift 文档解释了 !可选类型的拆箱运算符,

var optionalString : String? = "optional"
var regularString: String = optionalString!

但他们自己在类型定义(字符串!)上使用了它,但我没有找到明确的解释。

例子:

func takesBang(value:String!) -> String {
if !value {
return "nil value, without the safe syntax"
}

return "This works"
}

var unsafe:String!
takesBang(unsafe) // yields "nil value, without the safe syntax"

字符串! type 不会强制取消装箱可选类型,但似乎只是消除了对可选语法 (?.) 的需要。 Apple 在他们自己的示例中使用了它,但它似乎只否定了可选的安全(指针)机制。

谁能解释一下目的/动机?这似乎通常不安全,因为调用者不必检查或至少考虑它们的值。

最佳答案

语言引用指出,?还有! , 当用于 var 时声明只是语法糖(意味着它们在解析期间被编译器替换)。它们映射到 Optional<T> (?) 和 ImplicitlyUnwrappedOptional<T> (!) 分别。

虽然您必须使用 if let maybeNil = someVar? { ... } Optional<T> 类型变量的语法,您不必对隐式解包的可选值这样做(顾名思义)。作为https://stackoverflow.com/a/24071003/1599345中的海报已经提到,隐式展开的可选值旨在与旧版 Objective-C API 一起使用,因为它们没有为 Swift 提供足够的信息。

所以作为一个简短的回顾:

var foo : SomeType? // should be read as var foo : Optional<SomeType>
var bar : SomeType! // should be read as var bar : ImplicitlyUnwrappedOptional<SomeType>

?的用法和 !当使用变量中的实际值时,实际上是一个可以用这种方式读取的映射,类似于上面的声明:

foo?.somemethod() // if let maybeFoo = foo { maybeFoo.somemethod() }

foo!.somemethod() /* # Yeah I know for sure, that this is NOT nil ever ever… just call `somemethod` and kill me at runtime if it doesn't work out.

关于ios - swift:强制类型修饰符 "!"- 为什么它在 UIKit API 中使用(现在不合时宜),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24070919/

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