小编典典

在 Swift 中使用索引映射或减少

all

有没有办法在 Swift 中mapreduce在 Swift 中获取数组的索引?我正在寻找类似each_with_indexRuby的东西。

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的变量。


阅读 61

收藏
2022-08-21

共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,您将无法将元组中的索引和元素分开,因为您已经在方法签名中拥有累积/当前元组。相反,您需要在闭包的第二个参数上使用.0and
.1``reduce

let summedProducts = numbers.enumerate().reduce(0) { (accumulate, current) in
    return accumulate + current.0 * current.1
    //                          ^           ^
    //                        index      element
}
print(summedProducts)   // 56

斯威夫特 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)]
2022-08-21