gpt4 book ai didi

swift - 从检查 nil 值的结构优雅地填充字典

转载 作者:搜寻专家 更新时间:2023-11-01 06:16:39 25 4
gpt4 key购买 nike

给定一个结构 A,我想用该结构中的值填充一个 NSDictionary,前提是它们不为零。
为此,我插入所有值,然后循环遍历字典,删除所有 nil。有没有更优雅、更简洁、更少暴力破解的解决方案?

struct A {
var first:String?
var second:String?
var third:String?

/* some init */
}

let a = A(/*some init*/)

var dictionary = [
"first":a.first,
"second":a.second,
"third":a.third
]

for (key,value) in dictionary {
if value == nil {
dictionary.removeValue(forKey: key)
}
}

最佳答案

拥有可选值的字典通常不是一个好主意。字典使用 nil 的赋值作为您要从字典中删除键/值对的指示。此外,字典查找返回一个可选值,因此如果您的值是可选的,您最终将得到一个需要解包两次的双可选值。

您可以使用分配 nil 删除字典条目这一事实,通过仅分配值来构建 [String : String] 字典。 nil 不会进入字典,因此您不必删除它们:

struct A {
var first: String?
var second: String?
var third: String?
}

let a = A(first: "one", second: nil, third: "three")

let pairs: [(String, String?)] = [
("first", a.first),
("second", a.second),
("third", a.third)
]

var dictionary = [String : String]()

for (key, value) in pairs {
dictionary[key] = value
}

print(dictionary)
["third": "three", "first": "one"]

正如@Hamish 在评论中指出的那样,您可以对 使用DictionaryLiteral(在内部只是一个元组数组),这样您就可以使用更清晰的字典语法:

let pairs: DictionaryLiteral<String,String?> = [
"first": a.first,
"second": a.second,
"third": a.third
]

所有其他代码保持不变。

注意:您可以只编写 DictionaryLiteral 并让编译器推断类型,但我已经看到 Swift 无法编译或编译大型字典文字非常缓慢。这就是为什么我在这里展示了显式类型的使用。


或者,您可以跳过 pairsArrayDictionaryLiteral 并直接分配值:

struct A {
var first: String?
var second: String?
var third: String?
}

let a = A(first: "one", second: nil, third: "three")

var dictionary = [String : String]()

dictionary["first"] = a.first
dictionary["second"] = a.second
dictionary["third"] = a.third

print(dictionary)
["third": "three", "first": "one"]

关于swift - 从检查 nil 值的结构优雅地填充字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43356680/

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