结构的下标数组

时间:2017-07-19 10:14:23

标签: arrays swift struct

鉴于我有这样的阵列:

let array = [Struct(key: "a", value: 1), Struct(key: "b", value:2)]

如何用键下标数组?

array["b"]会很好,但正如预期的那样,它不起作用。

编辑:我没有使用字典的原因是我需要保留项目的顺序。

4 个答案:

答案 0 :(得分:4)

这是解决方案的语法糖,@ AdamBardon。

您可以扩展Array以允许您直接下标。在幕后,它只是使用相同的first(where:)调用:

protocol HasKey {
    var key: String { get }
}

struct Struct: HasKey {
    var key: String
    var value: Int
}

extension Array where Element: HasKey {
    subscript(str: String) -> Element? {
        return self.first(where: { $0.key == str })
    }
}

示例:

let array = [Struct(key: "a", value: 1), Struct(key: "b", value:2)]

if let x = array["a"] {
    print(x)
}

输出:

Struct(key: "a", value: 1)

使用protocol,您可以轻松地将此功能扩展到具有class属性的任何structkey: String,方法是让他们采用HasKey属性:

extension SomeOtherClass: HasKey { }

您还可以通过检查protocol

,在没有Element == Struct的情况下完成此操作
extension Array where Element == Struct {
    subscript(str: String) -> Element? {
        return self.first(where: { $0.key == str })
    }
}

答案 1 :(得分:2)

你可以制作下面的代码字典:

let myDictionaryOfDictionaries : [String : [String : String]] =
["Apples" : ["Colour" : "Red", "Type" : "Granny Smith"],
 "Oranges" : ["Colour" : "Orange", "Type" : "Seville"]]

print(myDictionaryOfDictionaries["Apples"] ?? "")

希望它会对你有所帮助。

答案 2 :(得分:1)

你应该使用字典。数组旨在通过索引而不是元素的属性来访问元素。索引也必须是整数。

另一方面,字典是键值对,因此使用字典似乎非常适合您的用例。 let structs = ["a":Struct(key:"a",value:1),"b":Struct(key:"b",value:2)] structs["b"]返回带有键" b"。

的结构

答案 3 :(得分:1)

这不是我想象解决方案的确切方式,但它是解决我问题的好方法。

我得到了我需要的东西: array.first(where: { $0.key == "b" })