arrays - 如何创建一个字典,键作为 NSObject 的子类,值作为数组?迅速
问题描述
我想创建一个字典,其中键可以是任何子类,NSObject
值是子类数组NSObject
。
我试过了:
class ABC: NSObject {
var a: Int? = 0
convenience init(a: Int) {
self.init()
self.a = a
}
}
class XYZ: NSObject {
var b: String? = "just checking"
var objOfABC: ABC?
convenience init(b: String, obj: ABC) {
self.init()
self.b = b
self.objOfABC = obj
}
}
let arr = [ XYZ(b: "str1", obj: ABC(a: 1)),
XYZ(b: "str2", obj: ABC(a: 2)),
XYZ(b: "str4", obj: ABC(a: 1)),
XYZ(b: "str7", obj: ABC(a: 3)),
XYZ(b: "str0", obj: ABC(a: 1)),
XYZ(b: "str9", obj: ABC(a: 2)),
]
var dictionary: [ABC: [XYZ]] = [:]
for obj in arr {
dictionary[obj.objOfABC ?? ABC()]?.append(obj)
}
for obj in dictionary {
print(obj.key.debugDescription)
print(obj.value.debugDescription)
}
是dictionary
零。
有人可以指出我做错了什么吗?
解决方案
你的字典一开始是空的。所以每次调用dictionary[someKey]
都会返回nil
。这导致append(obj)
永远不会被调用并且字典仍然是空的。
访问密钥时提供默认值:
dictionary[obj.objOfABC ?? ABC(), default: []].append(obj)
推荐阅读
- jmeter - --start-offset --end-offset 在 JMeterPluginsCMD.bat 命令中的用法
- javascript - 在选择列表项或单击组件外部时反应关闭下拉菜单
- android - For how long can a Worker in Android keep retrying doing a request?
- unity3d - 从相机到鼠标 Unity 3D 绘制光线?
- r - 在 R 中预测曲线上的值
- spring - 为什么我不能将间隔解析为 JPA 中的参数?
- node.js - 如何使用 Node Fetch 将来自 HTTP 请求的数据保存在变量中?
- amazon-web-services - 创建 IAM 角色时出错:MalformedPolicyDocument:已禁止字段资源
- jenkins - Jenkins - 如何为大文件发送多部分表单数据
- python - pymongo.errors.ConfigurationError: query() got an unexpected keyword argument 'lifetime'