【问题标题】:Subscript array of structs结构体的下标数组
【发布时间】:2017-07-19 10:14:23
【问题描述】:

鉴于我有一系列这样的结构:

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

如何用键为数组下标?

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

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

【问题讨论】:

  • 使其成为字典数组

标签: arrays swift struct


【解决方案1】:

这是围绕您的解决方案的语法糖,@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 属性的任何classstruct,方法是让它们采用HasKey 属性:

extension SomeOtherClass: HasKey { }

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

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

【讨论】:

  • 这正是我一直在寻找的! :) 谢谢
【解决方案2】:

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

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

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

希望对你有所帮助。

【讨论】:

  • 我刚刚编辑了我的问题,我不使用字典的原因是我需要保留项目的顺序。
【解决方案3】:

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

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

【讨论】:

  • 是的,字典是我的首选,但是我需要保留顺序
  • 在大多数情况下,解决字典无序问题比尝试访问具有非整数索引的数组元素更容易。您到底想做什么,需要订购?
  • 上下文太复杂,这里就不解释了,但无论如何我有一个替代方案。我会提供它作为答案,因为它解决了我的问题。尽管如此,还是感谢您的帮助。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多