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
以返回一个元组时,编译器应该会抱怨。我错过了什么?
答案 0 :(得分:3)
是的,下标方法可以有一个元组类型。
首先,您已将subscript
值定义为可选
(Foo, Bar)?
,因此newValue
需要解开。 (你必须这样做
如果newValue
为nil
,请决定该怎么做。)
其次,如果你想
要按名称.foo/.bar
访问元组成员,您必须定义一个命名元组:
subscript(index: Int) -> (foo: Foo, bar: Bar)? {
// ...
set(newValue) {
if let value = newValue {
foos[index] = value.foo
bars[index] = value.bar
}
}
}
或者,使用value.0
和value.1
访问元组成员。