Swift:从1开始枚举?

Swift: enumerated starting at 1?

在Swift中,是否可以枚举一个从1开始的序列?

就我而言,我使用的是 SQLite C interface to bind values to prepared statementssqlite3_bind_*() 例程的第二个参数是要设置的 SQL 参数的索引。索引从 1 开始。(即,它们是基于 1 的。)

我可以使用 Sequence.enumerated() 并在每次迭代中将 n 加 1,如下所示:

for (n, value) in values.enumerated() {
  sqlite3_bind_int(stmt, Int32(n)+1, value)
}

但是有没有办法从1开始n

不,Swift 中的所有集合索引都是从零开始的,但如果您确实需要,您可以创建自己的自定义枚举,压缩一系列 Int32 值和源集合:

extension Collection {
    var enumerated: Zip2Sequence<PartialRangeFrom<Int32>, Self> { zip(1..., self) }
}

用法:

let values: [Int32] = [10, 20, 30]

for (n, value) in values.enumerated {
    print("value:", value, "at:",  n)
}

这将打印

value: 10 at: 1

value: 20 at: 2

value: 30 at: 3

正如其他人所说,数组索引在 Swift 中从 0 开始,因此如果您想要开箱即用的基于 1 的索引,则需要编写一些额外的代码。

如果您只使用一次索引,那么任何变通方法都可能不值得付出努力,在调用站点递增是最直接的解决方案。

但是,如果您需要在循环中多次使用递增的索引,您可以采取的另一种方法是隐藏索引:

for (n, element) in [1, 2,3].enumerated() {
    let n = n + 1
    sqlite3_bind_int(stmt, Int32(n), value)
}

另一种方法可以使用 map():

for (n, element) in [1, 2,3].enumerated().map({([=11=]+1,)}) {
    sqlite3_bind_int(stmt, Int32(n), value)
}

,但不确定您是否从这个解决方案中获益良多,因为代码有点晦涩难懂。