Swift でインデックスを使用してマップまたは縮小する 質問する

Swift でインデックスを使用してマップまたは縮小する 質問する

mapSwiftで配列のインデックスを取得する方法はありますか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を使用して、シーケンス ( ArrayStringなど) を、整数カウンタと要素がペアになったタプルのシーケンスに変換できます。つまり、次のようになります。

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定義へのリンク

これは、索引コレクションの—は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と を使用する必要があります。.1reduce

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)]

おすすめ記事