【问题标题】:Swift: enumerated starting at 1?Swift:从 1 开始枚举?
【发布时间】:2020-04-14 01:07:39
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: swift loops enumerate


    【解决方案1】:

    不,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
    

    【讨论】:

      【解决方案2】:

      正如其他人所说,数组索引在 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({($0+1,$1)}) {
          sqlite3_bind_int(stmt, Int32(n), value)
      }
      

      ,但是不确定您是否从这个解决方案中获得了很多,因为代码有点晦涩。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-21
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多