gpt4 book ai didi

ios - swift - `NSUnknownKeyException` : calling `setValue:forKey` on NSObject with optional values in dictionary

转载 作者:行者123 更新时间:2023-11-28 08:16:55 24 4
gpt4 key购买 nike

下面最小示例中的代码(如此之小以至于没有真正意义......)崩溃:*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__lldb_expr_345.People 0x60800002a5a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key names.'

如果字典是从 [String, LastName?] 改变的,它工作得很好至 [String, LastName] .所以我猜类型 Optional<LastName>不能用 KVC 表示怎么办?我认为它能够将类型推断为 _Nullable .

如何使此代码与包含可选值(我自己的 NSObject 子类或值类型)的字典一起使用?

class LastName: NSObject {
let name: String
init(_ name: String) { self.name = name }
override var description: String { return name }
}

class People: NSObject {
var names: [String: LastName?] = [:] //problem caused by optional `Lastname`
override var description: String {
return "names: \(names)"
}
}

func createPeople(_ names: [String: LastName]) -> NSObject {
let classType: NSObject.Type = People.self
let instance = classType.init()
instance.setValue(names, forKey: "names") //crash here NSUnknownKeyException
return instance
}


print(createPeople(["Steve": LastName("Jobs")]))

最佳答案

在 Objective-C 中,字典的值不能为 nil。为了允许等价,有一个名为 NSNull 的类,它在非现代 Objective-C 中曾经被使用。

但在现代的 Objective-C/Swift 世界中,没有可选值的 names 将具有如下类型:

NSDictionary<NSString, LastName>*

NSDictionary 中的键和值类型不能被标记为可为空。如果您试图强制在 Objective-C 中访问 names 成员,例如:

@objc var names: [String: LastName?] = [:]

你会得到一个编译错误:

error: property cannot be marked @objc because its type cannot be represented in Objective-C

作为可行的解决方案,将名称类型更改为:

var names: [String: Any] = [:]

并使用 NSNull.null 作为没有值的占位符。老派,但它会起作用。

关于ios - swift - `NSUnknownKeyException` : calling `setValue:forKey` on NSObject with optional values in dictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42362152/

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