我可以为Swift创建静态下标吗?

10
标题已经很清楚地解释了问题,我想做类似这样的事情:MyStruct[123],而不需要调用一个函数(MyStruct.doSomething(123))或创建一个实例(MyStruct()[123])。将其放在类或结构中都可以。

标题不清楚。您是想要一个大小为编译时常量的数组,还是指其他什么? - rob mayoff
另外,发送到下标的参数可以是任何东西:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html - gfpacheco
1
我认为类上无法使用下标,只能在类的实例上使用。 - JAL
1
@gfpacheco 或许可以使用私有初始化的全局变量? - onmyway133
@onmyway133 看起来像是静态下标,但实际上并不是。点赞,因为这对其他人可能有用 =] - gfpacheco
2个回答

11

自 Swift 5.1 开始,静态和类下标脚本成为可能 (提案 SE-0254)。它们被称为 类型下标脚本

因此,现在可以这样做:

struct MyStruct {
    static var values = ["a", "b", "c"]
    static subscript(index: Int) -> String {
        values[index]
    }
}

print(MyStruct[2]) // prints c

7

简短的回答是不行。静态只限于结构体或类中的方法和属性。下标是运算符,不能设置为静态。但是可以这样做:

struct TimesTable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// prints "six times three is 18"

但你确实需要创建一个threeTimesTable对象(在这种情况下)。此外,值得一看的是:

http://www.codingexplorer.com/custom-subscripts-swift/


我也发现了这一点,既然你写了一个好答案,我就接受了 =] - gfpacheco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接