1. ホーム
  2. swift

[解決済み] Swiftでインデックスを使ったMapまたはReduce

2022-04-24 09:16:09

質問

の配列のインデックスを取得する方法はありますか? map または reduce をSwiftで使うことはできますか?私は次のようなものを探しています。 each_with_index をRubyで作成しました。

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 変数 上記 .

解決方法は?

を使用することができます。 enumerate を使用すると、シーケンス ( Array , String など)を、整数のカウンタとand要素が対になったタプルの列に変換する。つまり

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 というのも、メソッドのシグネチャにすでに累積/現在のタプルが含まれているからです。その代わりに .0.1 の2番目のパラメータで 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の構文はかなり違うので。

また、short-syntax/inlineを使用すると、辞書に配列をマッピングすることができます。

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