swift 将Dictionary的Key设置为等于结构示例中用作Value的属性

mnemlml8  于 2023-04-19  发布在  Swift
关注(0)|答案(3)|浏览(129)

我是一个新的编码一般,我开始我的旅程与Swift;所以,如果我没有在下面的内容中正确地解释我自己,请随时要求任何澄清(当然,提前感谢)。下面是故事:

背景:

我已经声明了一个结构体,它有一个常量属性,在示例化时设置为一个唯一的ID整数。
此外,我已经声明了一个字典,其中Keys将是唯一的ID Integer Number,Values是前面声明的Structure的示例。Dictionary Key中的唯一ID Integer应该等于作为Value添加到Dictionary的struct示例中的ID Integer属性。
下面是代码说明:

struct SampleStruct {
    let id: Int
    var title: String //this variable is irrelevant to the question
}

var sampleDictionary: [Int : sampleStructInstance] = [:]

sampleDictionary[1] = SampleStruct(id: 1, title: "Test text") 
// Dictionary Key 1 is equal to Value.id 1 

sampleDictionary[2] = SampleStruct(id: 2, title: "Test text")
// Dictionary Key 2 is equal to Value.id 2

**问题:**如何编写代码,以便在将struct示例作为值添加到字典键时,代码访问struct示例,检查ID号,并将字典键设置为该ID号?

由于我是新的编码,没有什么太多的尝试,虽然我已经尝试谷歌我的问题,我没有成功地找到它的答案。

rfbsl7qr

rfbsl7qr1#

编写一个方法,将结构体相应地添加到字典中

func addToSampleDictionary(sample: SampleStruct) {
    sampleDictionary[sample.id] = sample
}

并加以利用

let sample1 = SampleStruct(id: 1, title: "Test text")
addToSampleDictionary(sample: sample1)
vu8f3i0k

vu8f3i0k2#

在swift中,你可以通过在扩展中添加方法或计算属性来扩展现有类型的功能,这样我们就可以在Dictionary中这样做。在这样做的时候,你也可以通过添加where条件来限制扩展中的代码如何使用。
所以这里是扩展,我们说键必须是Int,值必须是SampleStruct

extension Dictionary where Key == Int, Value == SampleStruct

我们现在可以向这个扩展添加一个函数,并使它特定于SampleStruct
extension Dictionary where Key == Int,Value == SampleStruct { mutating func add(_ object:值){ self[object.id] = object } }
为了使用这个函数,我们可以这样做

var sampleDictionary: [Int : SampleStruct] = [:]
sampleDictionary.add(SampleStruct(id: 1, title: "Test text"))
sampleDictionary.add(SampleStruct(id: 2, title: "Test text"))
eanckbw9

eanckbw93#

确保字典键和结构id匹配的最简单方法是创建一个辅助函数来添加到字典中:

var sampleDictionary: [Int : SampleStruct] = [:]

func addSampleStruct(_ sampleStruct: SampleStruct) {
    sampleDictionary[sampleStruct.id] = sampleStruct
}

addSampleStruct(SampleStruct(id: 1, title: "Test text"))
addSampleStruct(SampleStruct(id: 2, title: "Test text"))

一种确保字典永远不会被直接访问的方法,可能会添加不匹配的键和id,是创建一个单独的类或结构,其中包含字典和添加/获取等功能:

struct SampleDictionary {
    private var dictionary: [Int: SampleStruct] = [:]
    
    mutating func add(_ sampleStruct: SampleStruct) {
        dictionary[sampleStruct.id] = sampleStruct
    }
    
    func sampleStruct(withId id: Int) -> SampleStruct? {
        dictionary[id]
    }
    
    mutating func removeSampleStruct(withId id: Int) {
        dictionary[id] = nil
    }
    
    var count: Int {
        dictionary.count
    }
}

var sampleDictionary = SampleDictionary()

sampleDictionary.add(SampleStruct(id: 1, title: "Test text"))
sampleDictionary.add(SampleStruct(id: 2, title: "Test text"))

print("count: \(sampleDictionary.count)")

for id in 1...3 {
    if let sampleStruct = sampleDictionary.sampleStruct(withId: id) {
    print("sampleStruct with id \(id) = \(sampleStruct)")
    } else {
        print("there is no sampleStruct with id \(id)")
    }
}

相关问题