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