Swift中如何将字典键自动设为对应结构体实例的id属性值?
如何自动用结构体实例的ID作为字典键?
问题描述
我是Swift编程新手,正在学习Swift。我定义了一个包含唯一整数ID常量的结构体,还有一个以该ID为键、结构体实例为值的字典,要求字典的键必须和对应实例的id属性值一致。目前每次添加实例都需要手动指定键,想实现自动获取实例的id作为对应的字典键。
示例代码:
struct SampleStruct { let id: Int var title: String // 该属性与问题无关 } var sampleDictionary: [Int : SampleStruct] = [:] // 当前需要手动编写键,确保和实例id一致 sampleDictionary[1] = SampleStruct(id: 1, title: "Test text") sampleDictionary[2] = SampleStruct(id: 2, title: "Test text")
解决方案
方法1:给目标字典类型添加扩展方法
直接扩展[Int: SampleStruct]字典类型,新增一个专门的方法自动完成键的匹配:
extension Dictionary where Key == Int, Value == SampleStruct { mutating func add(_ item: SampleStruct) { self[item.id] = item } }
使用方式:
// 直接传入结构体实例,自动用实例的id作为键存入字典 sampleDictionary.add(SampleStruct(id: 3, title: "New Test Entry"))
方法2:使用全局辅助函数(新手友好)
如果觉得扩展语法有点难理解,也可以写一个简单的全局函数来处理:
func addItemToDictionary(_ item: SampleStruct, into dict: inout [Int: SampleStruct]) { dict[item.id] = item }
使用方式:
// 调用函数传入实例和字典(注意字典前要加&标记为可修改) addItemToDictionary(SampleStruct(id: 4, title: "Another Test"), into: &sampleDictionary)
进阶拓展:让结构体遵循Identifiable协议
如果你的项目使用SwiftUI,或者想让结构体更符合Swift的规范,可以让SampleStruct遵循Identifiable协议(协议要求结构体拥有id属性,你的结构体已经满足这个条件):
struct SampleStruct: Identifiable { let id: Int var title: String }
之后可以写出更通用的字典扩展,适配所有遵循Identifiable且id为Int类型的结构体:
extension Dictionary where Key == Int, Value: Identifiable, Value.ID == Int { mutating func add(_ item: Value) { self[item.id] = item } }
这个扩展可以复用在多个类似的结构体上,不用重复写代码。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

