有没有办法在 Swift 中map或reduce在 Swift 中获取数组的索引?我正在寻找类似each_with_indexRuby的东西。
map
reduce
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的变量。
odd
您可以使用enumerate将序列(Array、String等)转换为具有整数计数器和元素配对的元组序列。那是:
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定义
请注意,这与获取集合的 索引enumerate不同——返回一个整数计数器。这与数组的索引相同,但在字符串或字典上不会很有用。要获取每个元素的实际索引,您可以使用zip:
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
.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 的语法完全不同。 此外,您可以使用短语法/内联将数组映射到字典:
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)]