通过下标访问元组

Access tuples by subscript

假设我有这个代码:

let tuples = ("1", 2, "3", "4", "5", "6", "7", false)

func tableView(tableView:NSTableView, viewForTableColumn tableColumn:NSTableColumn?, row:Int) -> NSView?
{
    let valueForView = tuples[row]
}

有什么方法可以通过下标访问元组吗?

不行,只能通过直接指定索引来访问元组元素,例如

tuples.5

为了您的目的,您应该简单地使用一个数组。

元组无法实现您想要的,如果您不想稍后强制转换所有内容,您唯一的选择是结构或 class。 struct 似乎是更好的选择:)

struct MyStruct {
    let opt1 = 0
    let opt2 = 0
    let opt3 = 0
    ...
    let boolThing = false
}

如果您愿意在元组周围做一个包装器,这实际上是可能的。话虽这么说,这太可怕了,永远不要这样做。其他答案中的建议实际上要好得多,但出于教育目的,这是我的示例。

struct TupleWrapper {
    let tuple: (String, Int, String, String, String, String, String, Bool)    
    let count: Int
    private let mirrors: [MirrorType]

    subscript (index: Int) -> Any {
        return mirrors[index].value
    }

    init(tuple: (String, Int, String, String, String, String, String, Bool)) {
        self.tuple = tuple

        var mirrors = [MirrorType]()
        let reflected = reflect(tuple)

        for i in 0..<reflected.count {
            mirrors.append(reflected[i].1)
        }

        self.mirrors = mirrors
        self.count = mirrors.count
    }
}

let wrapper = TupleWrapper(tuple: ("1", 2, "3", "4", "5", "6", "7", false))
wrapper[0] // "1"
wrapper[wrapper.count - 1] // false

上面的代码使用 Swift 的反射 API 来获取元组对象的逻辑子对象,并将它们的镜像添加到一个数组中,我们可以在该数组上为每个镜像的值下标。这是相当简单的,但正如您所期望的那样,由于我们在这里使用元组,因此不能以任何方式使其真正动态化。必须为特定的元组类型制作包装器。

有关一些相关阅读,请参阅 NSHipster 最近的 MirrorType 文章。

使用反射是有可能的:

Mirror(reflecting: tuples).children[AnyIndex(row)].value