0

map {}関数に連鎖できる関数を書いてみたいと思います。例:Swiftの連鎖方法

let arr = [1,2,3,4,5] 
let list = arr.map { $0 * 2 }.applyRuleToSubtractVal(1) // return [1,3,5,7,9] 

上記のapplyRuleToSubtractVal()をどのように定義すればよいですか? (私はもっと複雑なことを行い、マップ内でそれらをやりたいとは思わない)

+0

と1つの列挙で同じことを達成できるあなたは 'arr.map {$ 0評価「」' map'、次のことができチェーン 'map'、*内部のことを行う必要はありません。 2} .map {do_something_complex($ 0)} .map {$ 0 + 1} 'となります。 – molbdnilo

答えて

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) } 
+0

私は@ sketchyTechの答えは、OPが連鎖性を探しているので正しいと思います。あなたはそうです。しかし、最適化については正しい。両方に+1。 – thesummersign

0

アレイの機能を拡張する必要があります。ドット演算子は、クラスまたは構造体のメソッドを呼び出します。独自の機能をArray構造体に拡張します。

2

マップはIntの配列を返します。したがって、ドット構文を使用してArray<Int>で実行可能な配列メソッドを適用できます。独自の方法を含めるには、これを可能にする方法で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の演算を実行できません。