map
Swiftで配列のインデックスを取得する方法はありますかreduce
? Ruby のようなものを探していますeach_with_index
。
func lunhCheck(number : String) -> Bool
{
var odd = true;
return reverse(number).map { String($0).toInt()! }.reduce(0) {
odd = !odd
return $0 + (odd ? ($1 == 9 ? 9 : ($1 * 2) % 9) : $1)
} % 10 == 0
}
lunhCheck("49927398716")
lunhCheck("49927398717")
odd
変数を削除したいその上。
ベストアンサー1
enumerate
を使用して、シーケンス ( Array
、String
など) を、整数カウンタと要素がペアになったタプルのシーケンスに変換できます。つまり、次のようになります。
let numbers = [7, 8, 9, 10]
let indexAndNum: [String] = numbers.enumerate().map { (index, element) in
return "\(index): \(element)"
}
print(indexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
これは、索引コレクションの—はenumerate
整数カウンタを返します。これは配列のインデックスと同じですが、文字列や辞書ではあまり役に立ちません。各要素とともに実際のインデックスを取得するには、次を使用しますzip
。
let actualIndexAndNum: [String] = zip(numbers.indices, numbers).map { "\($0): \($1)" }
print(actualIndexAndNum)
// ["0: 7", "1: 8", "2: 9", "3: 10"]
で列挙シーケンスを使用する場合reduce
、メソッド シグネチャにすでに累積/現在のタプルがあるため、タプル内のインデックスと要素を分離することはできません。代わりに、クロージャの 2 番目のパラメータで.0
と を使用する必要があります。.1
reduce
let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
return accumulate + current.0 * current.1
// ^ ^
// index element
}
print(summedProducts) // 56
Swift 3.0以上
Swift 3.0 の構文はかなり異なります。
また、辞書に配列をマップするには、短い構文/インラインを使用できます。
let numbers = [7, 8, 9, 10]
let array: [(Int, Int)] = numbers.enumerated().map { ($0, $1) }
// ^ ^
// index element
これにより、次のようになります。
[(0, 7), (1, 8), (2, 9), (3, 10)]