【发布时间】:2017-07-19 10:14:23
【问题描述】:
鉴于我有一系列这样的结构:
let array = [Struct(key: "a", value: 1), Struct(key: "b", value:2)]
如何用键为数组下标?
array["b"] 会很好,但正如预期的那样,它不起作用。
编辑:我不使用字典的原因是我需要保留项目的顺序。
【问题讨论】:
-
使其成为字典数组
鉴于我有一系列这样的结构:
let array = [Struct(key: "a", value: 1), Struct(key: "b", value:2)]
如何用键为数组下标?
array["b"] 会很好,但正如预期的那样,它不起作用。
编辑:我不使用字典的原因是我需要保留项目的顺序。
【问题讨论】:
这是围绕您的解决方案的语法糖,@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,您可以轻松地将此功能扩展到具有key: String 属性的任何class 或struct,方法是让它们采用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" })
【讨论】: