gpt4 book ai didi

swift 字典 : -[__NSCFNumber objectForKey:]: unrecognized selector sent to instance

转载 作者:行者123 更新时间:2023-11-28 13:29:10 32 4
gpt4 key购买 nike

我通过键(对象)访问字典,大部分时间工作正常,但有时它会崩溃:

-[__NSCFNumber objectForKey:]: unrecognized selector sent to instance 0x8000000000000000

我找到的最接近我的问题是 this one .

这是我的(简化的)代码:

class Meal {
private static let KEY = Date()
private static let KEY_Q = DispatchQueue(label: "Meal.KEY")
static var menus = OrderedDictionary<Date, [Int:Meal]>()

static func test() throws {
var date: Date?
var menu: [Int:Meal]?
try KEY_Q.sync {
menu = Meal.menus[KEY] // <-- Error
if menu == nil {
date = KEY.clone()
}
}
DispatchQueue.main.async {
//This needs to run on the UI Thread, since it also loops over Meal.menus
if date != nil {
Meal.menus[date!] = [Int:Meal]()
}
}
}
}

class Date: Hashable & Comparable {
var days = 0
func hash(into hasher: inout Hasher) {
hasher.combine(days)
}

func clone() -> Date {
let date = Date()
date.days = days
return date
}
}

class OrderedDictionary<keyType: Hashable, valueType>: Sequence {
var values = [keyType:valueType]()

subscript(key: keyType) -> valueType? {
get {
return self.values[key]
}
}
}

注意:

  • 条目从 UI Thread 添加到 menus,而我的代码在不同的线程中运行。
  • 字典中存储的键是 KEY 的克隆(不是 KEY 的引用)
  • 我认为错误可能是在迁移到 Swift 5 时开始出现的,因此 hash(into hasher: inout Hasher)

问题:

  • Swift 字典线程对于插入和访问是否安全?
  • 如何锁定 KEY 对象和 UI Thread
  • hash(into hasher: inout Hasher) 是否正确实现?
  • 为什么会出现此错误,我该如何解决?

最佳答案

这看起来很像一个线程问题(地址 0x8000000000000000 非常可疑),因此您可以按照与读取相同的方式序列化写入:

    DispatchQueue.main.async {
//This needs to run on the UI Thread, since it also loops over Meal.menus
if let date = date {
KEY_Q.sync {
Meal.menus[date] = [Int:Meal]()
}
}
}

为了避免在其他地方无意中重新引入错误的可能性,您还可以考虑将队列和访问包装在一个小帮助程序对象中(这样访问可以发生在正确的队列上)。

关于 swift 字典 : -[__NSCFNumber objectForKey:]: unrecognized selector sent to instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57737909/

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