gpt4 book ai didi

swift - 覆盖 Swift 字典创建以不允许 nil

转载 作者:行者123 更新时间:2023-11-30 12:50:13 25 4
gpt4 key购买 nike

在这个 Playground 示例中,我希望找到一个扩展,可以删除我在创建字典时放入的所有 nils。

var someValue: String?

if false {
someValue = "test"
}

var dict = ["key": "value",
"key2": someValue]
print("\(dict)")
dict["key3"] = nil

print("\(dict)")

在上面的代码中,当前日志是

[AnyHashable("key2"): nil, AnyHashable("key"): Optional("value")]
[AnyHashable("key2"): nil, AnyHashable("key"): Optional("value")]

key3 永远不会被添加,因为设置 = nil 告诉它被删除。我想在字典的初始创建中添加该功能,但尚未找到可行的解决方案。

有效的解决方案将导致以下打印输出

[AnyHashable("key"): Optional("value")]
[AnyHashable("key"): Optional("value")]

最佳答案

这在 Swift 中是无法解决的。正确的写法是:

var dict = ["key": "value"]
if false {
dict["key2"] = "test"
}

Swift 不提供您所描述的语法,尝试强制它会破坏类型并产生错误情况。不要尝试创建[AnyHashable: Any?]。这是一个完全损坏的类型,将会烧毁您(Any?作为一种类型完全损坏,因为OptionalAny,并且任何东西都可以隐式地变成可选的,所以它变成了一个奇怪的递归兔子洞)。如果您必须桥接到 NSDictionary[AnyHashable: Any] 是可以接受的,但一般来说应该强烈避免它,并将其限制在您需要的地方。

请注意,这在 ObjC 中更加糟糕(你可以编写这种东西,但它会崩溃或截断你的字典,或者其他一些奇怪的错误),所以至少我们正在取得一些进展。

在很多情况下,当我看到人们遇到这个问题时,这是因为他们一开始就过度使用了选项。在您的 user.name 示例中,为什么 name 首先是可选的? nil 和 ""有什么区别吗?如果没有(通常没有),那么只需将 name 设置为非可选(在 ObjC 中不可为空)并将其默认为空,很多问题就会消失。具有相同值的两个版本(即 nil 和 ""具有相同含义)表示类型问题,而不是语法问题。

<小时/>

如果您想通过适用于键/值的快速扩展来稍微简化语法?像这样的配对:

extension Dictionary {
init(keyOptionalPairs: [(Key, Value?)]) {
var d: [Key: Value] = [:]
for (key, value) in keyOptionalPairs {
d[key] = value
}
self = d
}
}

let keyValues: [(String, String?)] = [
("key", "value"),
("key2", nil)
]

let dict = Dictionary(keyOptionalPairs: keyValues)

但请注意,字典是[String: String],而不是[String: String?]。这是故意的。

与您的语法相比,它只是添加了一组括号。但与普通版本相比,它并不漂亮,但非常简单。

let dict: [String: String] = {
var d: [String: String] = [:]
d["key"] = "value"
d["key2"] = nil
return d
}()

关于swift - 覆盖 Swift 字典创建以不允许 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41107668/

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