gpt4 book ai didi

swift - 检查 Swift 字典扩展中的 nil 值

转载 作者:行者123 更新时间:2023-11-30 11:58:22 24 4
gpt4 key购买 nike

我的 Playground 文件中有以下代码:

extension Dictionary {

func test() {

for key in self.keys {
self[key]
}
}
}

var dict: [String: AnyObject?] = [
"test": nil
]

dict.test()

此后我将把 for-each 循环中的行称为输出,因为它是相关的。在这个特定的实例中,输出为nil

当我将 for-each 循环更改为如下所示时:

for key in self.keys {
print(self[key])
}

输出为“可选(nil)\n”

我真正想做的是检查 nil 值,但是代码:

for key in self.keys {
self[key] == nil
}

输出false

我尝试过的另一件事如下:

for key in self.keys {
self[key] as! AnyObject? == nil
}

这会产生错误:

Could not cast value of type 'Swift.Optional<Swift.AnyObject>' to 'Swift.AnyObject'

非常感谢您提供任何帮助!

最佳答案

你已经把自己搞得一团糟了,因为一个值可以为 nil 的字典给你带来了一个双重包裹的Optional的前景,因此两个各种nil。如果 key 丢失,您会得到 nil;如果 key 丢失并且您解开包装,您会得到 nil获取的结果。不幸的是,您正在 Playground 上进行测试,这对于探索这种区别来说是一个糟糕的场所。

要明白我的意思,请考虑以下内容:

var d : [String:Int?] = ["Matt":1]
let val = d["Matt"]

val 的类型是什么?它是 Int?? - 一个 Int 包含在一个可选值中,另一个可选值包含在另一个可选值中。这是因为,根据定义,字典内的值是一个封装在Optional中的Int,然后通过其键获取值,该值封装在另一个Optional中。

现在让我们更进一步,这样做:

var d : [String:Int?] = ["Matt":nil]
let val = d["Matt"]

什么是val?嗯, Playground 可能会它是nil,但事实要复杂得多;它是nil包裹在另一个Optional中。如果您打印val,则最容易看到,在这种情况下,您得到的不是nil,而是“Optional(nil)” .

但是,如果我们尝试做一些根本不存在 key 的事情,我们会得到一个不同的答案:

let val2 = d["Alex"]

这确实是 nil,表示 key 丢失。如果我们打印 val2,我们会得到“nil”。 Playground 无法区分(它对 valval2 都显示 nil),但转换为字符串(这就是 >print 确实)显示了差异。

所以问题的一部分是整个双重包装的可选事物,另一部分是 Playground 以一种非常误导的方式表示双重包装的可选。

道德 1:值类型为可选的字典可能会变得非常棘手。

道德 2: Playground 是魔鬼的杰作。避开他们。使用真实的应用程序,并使用日志记录到控制台或调试器的变量 Pane ,以查看到底发生了什么。

关于swift - 检查 Swift 字典扩展中的 nil 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47539182/

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