0

Ich möchte eine Funktion schreiben, die ich verketten kann, um Funktionen {} zuzuordnen. Zum Beispiel:Verkettungsmethoden in Swift

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

Wie definiere ich applyRuleToSubtractVal() oben? (Ich möchte komplexere Dinge tun und möchte sie nicht innerhalb der Karte machen.)

+0

Sie brauchen nicht Dinge in „der“ 'map' zu tun, Sie können Kette' map', wie 'arr.map {$ 0 * 2} .map {do_something_complex ($ 0)} .map {$ 0 + 1} '. – molbdnilo

Antwort

3

sketchyTech Antwort ist richtig, aber eigentlich ist es nur die Tatsache versteckt, dass

let list = arr.map { $0 * 2 }.map { $0 - 1 } 

ausgeführt wird - das ist nicht optimal ist, als das Array zweimal aufgezählt wird.

Sie könnten das gleiche mit einer Aufzählung erreichen mit

let complexClosure = { (i: Int) in 
    return i-1 
} 
let list = arr.map { complexClosure($0 * 2) } 
+0

Ich denke @ sketchyTech's Antwort soll korrekt sein, da das OP nach Kettenfähigkeit sucht. Du bist. Korrigieren Sie jedoch die Optimierung. +1 für beide. – thesummersign

0

Sie müssen die Funktionalität des Arrays erweitern. Der Punktoperator ruft Methoden der Klasse oder Struktur auf. Erweitern Sie Ihre eigene Funktionalität auf die Array-Struktur.

2

Ihre Map gibt ein Array von Int zurück, so dass Sie jede Array-Methode anwenden können, die mit der Punktsyntax auf Array<Int> ausgeführt werden kann. Um Ihre eigenen Methoden einzuschließen, stellen Sie sicher, dass Sie Array auf eine Weise erweitern, die dies möglich macht, z.

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] 

Wenn wir Protokoll Einschränkungen haben hier nicht verwenden, dann würden wir nicht in der Lage sein, einen Minus-1-Betrieb durchzuführen, da es eine Reihe von jeder Art sein könnte.