【发布时间】:2021-06-10 16:44:27
【问题描述】:
我在过去几年发布的所有 Xcode 版本中成功进行了以下测试Xcode 12.5 beta 3 除外:
var nilString: String? = nil
var dict: [String: Any] = ["hello": nilString as Any]
var element = dict["hello"] as Any
print(element)
print(type(of: element))
switch element {
case Optional<Any>.none:
print("element is nil")
default:
assertionFailure("element is not nil. wtf?")
}
在 Xcode 12.4 中,我打印了这个
Optional(nil)
Optional<Any>
element is nil
在 Xcode 12.5 beta 3 中,我打印了这个
Optional(nil)
Optional<Any>
Fatal error: element is not nil. wtf?
有人能解释一下这个问题吗?我现在如何检查任何为零?它会在候选版本中修复吗?
更新 想要更加困惑?
var nilString: String? = nil
var element: Any = nilString as Any
print(element)
print(type(of: element.self))
switch element {
case Optional<Any>.none:
print("element is nil")
default:
assertionFailure("element is not nil")
}
输出:
nil
Optional<String>
element is nil
我想我的 nilString 在被放入字典时发生了问题。
【问题讨论】:
-
一个可选的
Dictionary值破坏了当值设置为nil时删除键的规则。在 Objective-C 中NSDictionarynil无论如何都不允许使用值。 -
我不知道发生了什么变化,但印刷措辞不准确。
nil as String?/Optional<String>.none在Any没有的地方工作。 IE。你可以找到nil,但你必须知道它的类型。 -
@Jessy 不过,
print(type(of: element))给了我Optional<Any> -
@Jessy 我想我做到了。让我仔细检查一下……
-
@Jessy 请检查我的答案,我仍然可能会错过一些东西