У Свифта есть односторонние шаги? - PullRequest
3 голосов
/ 18 апреля 2020

Я хочу сделать что-то вроде этого:

let sequence1 = stride(from: Int32(2), by: 2)
for (i, address) in zip(sequence1, addresses) {
  sqlite3_bind_int64(stmt, i, address.userID)
  sqlite3_bind_int(stmt, i+1, address.deviceID)
}

Но stride(from:by:) не существует.

Я знаю, что могу просто изменить первую строку на:

let sequence1 = stride(from: Int32(2), through: Int32.max, by: 2)

или:

let sequence1 = sequence(first: Int32(2), next: { $0 + 2 })

И я знаю, что у Свифта есть односторонние диапазоны, такие как PartialRangeFrom, но есть ли у Свифта односторонние шаги?

Связанный:

Ответы [ 2 ]

4 голосов
/ 18 апреля 2020

Нет, в Swift нет односторонних шагов.

Для общей (лениво оцененной) последовательности, повторяющейся через каждое второе целое число, ваш

let sequence1 = sequence(first: Int32(2), next: { $0 + 2 })

является простым, понятным, и гибкое решение. Альтернативой является

let sequence1 = (Int32(1)...).lazy.map { $0 * 2 }

В вашем конкретном случае я бы просто использовал односторонний диапазон:

for (i, address) in zip(Int32(1)..., addresses) {
    sqlite3_bind_int64(stmt, 2 * i, address.userID)
    sqlite3_bind_int(stmt, 2 * i + 1, address.deviceID)
}
0 голосов
/ 19 апреля 2020

Как они сказали, нет. Но ты все равно этого не хочешь. Слишком много плюсов. Разбейте свой частичный диапазон! 100

public extension Sequence {
  /// Splits a `Sequence` into equal "chunks".
  /// - Parameter maxArrayCount: The maximum number of elements in a chunk.
  /// - Returns: `Array`s with `maxArrayCount` `counts`,
  ///   until the last chunk, which may be smaller.
  subscript(maxArrayCount maxCount: Int) -> AnySequence<[Element]> {
    .init(
      sequence( state: makeIterator() ) { iterator in
        Optional(
          (0..<maxCount).compactMap { _ in iterator.next() },
          nilWhen: \.isEmpty
        )
      }
    )
  }
}
public extension Optional {
  /// Wraps a value in an optional, based on a condition.
  /// - Parameters:
  ///   - wrapped: A non-optional value.
  ///   - getIsNil: The condition that will result in `nil`.
  init(
    _ wrapped: Wrapped,
    nilWhen getIsNil: (Wrapped) throws -> Bool
  ) rethrows {
    self = try getIsNil(wrapped) ? nil : wrapped
  }
}
zip( (2...)[maxArrayCount: 2], addresses ).forEach {
  sqlite3_bind_int64(stmt, $0[0], $1.userID)
  sqlite3_bind_int(stmt, $0[1], $1.deviceID)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...