结构的下标数组



鉴于我有这样的 stuct 数组:

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

如何使用键对数组进行下标?

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

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

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

您可以扩展数组以允许您直接下标它。 在幕后,它只是使用相同的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,您可以通过让具有key: String属性的任何classstruct采用HasKey属性,轻松地将此功能扩展到它们:

extension SomeOtherClass: HasKey { }

您也可以在没有protocol的情况下通过检查Element == Struct来完成它:

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

您可以像下面的代码一样制作字典字典:

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

希望对您有所帮助。

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

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

这不是我想象的解决方案的确切方式,但它是一个很好的选择,可以解决我的问题。

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

最新更新