Swift下标实现可以设置元组值吗?

时间:2015-12-10 19:59:38

标签: swift

My Swift类正在实现一个包含以下(必需)下标的协议:

subscript(index: Int) -> (Foo, Bar)? { get set }

这应该允许我打电话,例如:

let (foo, bar) = myObject[3]

myObject[3] = (foo, bar)

实现getter非常简单:

subscript(index: Int) -> (Foo, Bar)? {
    get {
        // Return a tuple of the values at index in the Foos and Bars arrays.
        do {
            try return (Foos[index], Bars[index])
        } catch {
            return nil
        }
    }
}

然而,实现设置器似乎是不可能的,因为如果{{1}无法获得自动生成的newValue"成员"是一个元组。

newValue

我尝试将 set(newValue) { Foos[index] = newValue.foo // No can do. Bars[index] = newValue.bar // No can do. } 强制转换为元组类型,如下所示:

newValue

但编译器抱怨 set(newValue) { if let (track, trackNumber) = newValue as! (SongVersion, TrackNumber) { ... } } 不是newValue,因此无法投出。

在我看来,如果这种下标是不可设置的,那么当你试图重载Optional以返回一个元组时,编译器应该会抱怨。我错过了什么?

1 个答案:

答案 0 :(得分:3)

是的,下标方法可以有一个元组类型。

首先,您已将subscript值定义为可选 (Foo, Bar)?,因此newValue需要解开。 (你必须这样做 如果newValuenil,请决定该怎么做。)

其次,如果你想 要按名称.foo/.bar访问元组成员,您必须定义一个命名元组:

subscript(index: Int) -> (foo: Foo, bar: Bar)? {
    // ...

    set(newValue) {
        if let value = newValue {
            foos[index] = value.foo
            bars[index] = value.bar
        }
    }
}

或者,使用value.0value.1访问元组成员。