我想写一个我可以链接到map {}函数的函数。例如:
let arr = [1,2,3,4,5]
let list = arr.map { $0 * 2 }.applyRuleToSubtractVal(1) // return [1,3,5,7,9]
如何定义上面的applyRuleToSubtractVal()
? (我想做更复杂的事情,不想在地图中做这些事。)
答案 0 :(得分:3)
sketchyTech的答案是正确的,但实际上它只是隐藏了这个事实,
let list = arr.map { $0 * 2 }.map { $0 - 1 }
被执行 - 这不是最佳的,因为数组被枚举两次。
使用
进行一次枚举即可实现相同的效果let complexClosure = { (i: Int) in
return i-1
}
let list = arr.map { complexClosure($0 * 2) }
答案 1 :(得分:2)
您的地图返回一个Int
数组,因此您可以应用任何可以使用点语法在Array<Int>
上执行的Array方法。为了包含您自己的方法,请确保以可实现此目的的方式扩展Array
,例如。
extension Array where Element:IntegerType {
func applyRuleToSubtractValue(num:Int) -> Array {
return self.map{$0 - 1}
}
}
let arr = [1,2,3,4,5]
let list = arr.map{$0 * 2}.applyRuleToSubtractValue(1) // [1, 3, 5, 7, 9]
如果我们在这里没有使用协议限制,那么我们将无法执行减1操作,因为它可能是任何类型的数组。
答案 2 :(得分:0)
您需要扩展Array的功能。点运算符调用类或结构的方法。将您自己的功能扩展到Array结构。