Chr*_*ver 14 cocoa uikit ios swift
编辑:这个问题的目的是理解使用隐式可选运算符"!" 在早期的UIKit API更新中,特别是如果函数被声明为返回预期为非可选的类型,为什么要使用可选,如果它是可选的,为什么不使用可选的"?" 运营商."!"的语义 虽然总是很清楚.
随着时间的推移,苹果公司审核API以使选项更精确,使用?对于真正的可选类型,并且当它们实际上是非可选的时使用非可选类型.这是对最初的Objective-C签名的保留,这些签名通常含糊不清.
快速文档解释了目的!可选类型的拆箱操作符,
var optionalString : String? = "optional"
var regularString: String = optionalString!
Run Code Online (Sandbox Code Playgroud)
但他们在类型定义本身(String!)上使用它,没有我能找到的明确解释.
例:
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"
Run Code Online (Sandbox Code Playgroud)
字符串!type不会强制取消装入可选类型,但似乎只是删除了对可选语法的需要(?.).Apple在他们自己的例子中使用它,但它似乎只是否定了可选的安全(指针)机制.
任何人都可以解释目的/动机吗?这通常是不安全的,因为呼叫者不必检查或至少考虑它们的价值.
pun*_*ode 20
的语言参考指出两者,?也如!,上使用时var的声明仅语法糖(这意味着它们被编译器解析期间代替).它们分别映射到Optional<T>(?)和ImplicitlyUnwrappedOptional<T>(!).
虽然您必须使用if let maybeNil = someVar? { ... }类型变量的语法Optional<T>,但您不必使用隐式解包的选项(如名称所示).正如已经提到的/sf/answers/1684970241/中的海报所示,隐式解包的选项将用于传统的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>
Run Code Online (Sandbox Code Playgroud)
在变量中使用?和!使用实际值时的使用实际上是一个可以这种方式读取的映射,类似于上面的声明:
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.
Run Code Online (Sandbox Code Playgroud)
Chr*_*ver -1
事实证明,这只是 Apple 的一个疏忽,自 Beta 5 以来,他们一直在审核类并更新返回类型。
来自 Beta 6 发行说明:
“大量 Foundation API 已经过可选一致性审核,从其接口中删除了大量隐式解包的可选值。这澄清了其属性和参数/方法返回值的可空性。这是自 beta 5 以来的一项持续努力”。
| 归档时间: |
|
| 查看次数: |
6103 次 |
| 最近记录: |