gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:53 24 4
gpt4 key购买 nike

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

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

这应该允许我调用,例如:

let (foo, bar) = myObject[3]

myObject[3] = (foo, bar)

实现 setter/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
}
}
}

然而,实现一个 setter 似乎是不可能的,因为如果 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,所以它不能被强制转换。

在我看来,如果这种下标不可设置,那么当您尝试重载 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 访问元组成员。

关于swift - Swift 下标实现可以设置元组值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34210660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com