gpt4 book ai didi

swift - 如何编写处理可选值的字典扩展

转载 作者:IT王子 更新时间:2023-10-29 05:37:22 24 4
gpt4 key购买 nike

我正在尝试实现一个Dictionary 扩展,我想处理可选值。但无论我做什么,如果我在 [String: String?] 字典上使用我的方法,它都无法选择性地绑定(bind)值。如何编写字典扩展以优雅地处理可选值?


考虑以下扩展:

extension Dictionary {
func someMethod() {
for (key, value) in self {
if let valueString = value as? String {
println(" \(key) = \(valueString)")
} else {
println(" \(key) = \(value) cannot be cast to `String`")
}
}
}
}

因此请考虑以下代码:

let dictionary: [String: AnyObject?] = ["foo": "bar"]
dictionary.someMethod()

它奇怪地报告

foo = Optional(bar) cannot be cast to `String`

我可以编写一个非扩展方法来处理具有可选值的字典参数,但不知道如何将其作为 Dictionary 的扩展。

最佳答案

你可以通过反射(reflection)来做到这一点。不需要比您已有的更多的代码:

extension Dictionary
{
func someMethod()
{
for (key, value) in self
{
var valueRef = _reflect(value)

while valueRef.disposition == .Optional && valueRef.count > 0 && valueRef[0].0 == "Some"
{
valueRef = valueRef[0].1
}

if let valueString: String = valueRef.value as? String
{
print(" \(key) = \(valueString)")
}
else
{
print(" \(key) = \(value) cannot be cast to `String`")
}
}
}
}

let dictionary: [String : AnyObject?] = ["foo" : "bar"]
dictionary.someMethod()

返回

foo = bar

let dictionary: [String : AnyObject?] = ["foo" : nil]
dictionary.someMethod()

返回

foo = nil cannot be cast to `String`

let dictionary: [String : AnyObject?] = ["foo" : UIViewController()]
dictionary.someMethod()

返回

foo = Optional(<UIViewController: 0x7fee7e819870>) cannot be cast to `String`

关于swift - 如何编写处理可选值的字典扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756858/

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