Swift:从1开始枚举?
Swift: enumerated starting at 1?
在Swift中,是否可以枚举一个从1开始的序列?
就我而言,我使用的是 SQLite C interface to bind values to prepared statements。 sqlite3_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)
}
,但不确定您是否从这个解决方案中获益良多,因为代码有点晦涩难懂。
在Swift中,是否可以枚举一个从1开始的序列?
就我而言,我使用的是 SQLite C interface to bind values to prepared statements。 sqlite3_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)
}
,但不确定您是否从这个解决方案中获益良多,因为代码有点晦涩难懂。