gpt4 book ai didi

Swift - 动态匹配类

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

我正在尝试使用以下签名在 Dictionary 上编写扩展方法:

func firstNonNilObjectForKey(keys: [Key], ofClass aClass: Any.Type = String.self) -> Value?

这是为了帮助我处理 JSON 字典,我经常需要第一个非空值,但有时 JSON 包含 null 本身作为值,它被转换为 NSNull 在 Cocoa 中。

用法是这样的:

let dict: [String:AnyObject] = [...]
let myValue = dict.firstNonNilObjectForKey([ "key1", "key2" ]) as? String

问题是实现性的——如何匹配类:

if let value = self[key] {
if value is aClass { ... } <--- error: aClass is not a type
if let castedValue = value as? aClass { ... } <--- error: ditto

let type = value.dynamicType
if type == aClass { ... } <--- no error, but doesn't handle subclasses!

// Cannot use value.isKindOfClass() since value may be Any
}

我想到了一个替代方案:

func firstNonNilObjectForKey<ReturnValueType>(keys: [Key]) -> ReturnValueType?

允许实现为

if let value = self[key] as? ReturnValueType { ... }

但是:- 这里我无法设置默认类型(我主要需要 String.Type)。- 我不太确定如何调用它:

let value = dict.firstNonNilObjectForKey([ "key1", "key2" ]) as? String <--- error: Cannot invoke 'firstNonNilObjectForKey' with an argument list of type '([String])'
let value = dict.firstNonNilObjectForKey<String>([ ... ]) <--- error: Cannot explicitly specialize a generic function

我希望这不是重复的,但这里的大多数类似问题只是处理您与已知类匹配的情况。

最佳答案

我不确定我是否完全符合要求,但这样的东西对你有用吗?

extension Dictionary {

func firstNonNilObjectForKey(keys: [Key]) -> String? {
return self.firstNonNilObjectForKey(keys, ofClass: String.self)
}

func firstNonNilObjectForKey<T>(keys: [Key], ofClass aClass: T.Type) -> T? {
for k in keys {
if let v = self[k] as? T {
return v
}
}
return nil
}

}

let dict = ["key1": 2, "key2": "Foo"]
let aString = dict.firstNonNilObjectForKey(["key1", "key2"]) // "Foo"
let anInt = dict.firstNonNilObjectForKey(["key1", "key2"], ofClass: Int.self) // 2

这里的主要问题是我使用的是重载而不是默认参数,这似乎与快速类型检查器相处得不好。

关于Swift - 动态匹配类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32023939/

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