0

{} işlevlerini eşleştirmek için zincirleyebileceğim bir işlev yazmak istiyorum. Örneğin:Swift'de çaking yöntemleri

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

nasıl applyRuleToSubtractVal() yukarıda tanımlarım? (Daha karmaşık şeyler yapmak istiyorum ve bunları haritanın içinde yapmak istemiyorum.)

+0

ile bir numaralandırma ile aynı elde edebiliriz 2} .map {do_something_complex ($ 0)} .map {$ 0 + 1} '. – molbdnilo

cevap

3

sketchyTech cevabı doğrudur, ama aslında bu sadece, gerçeği gizleme

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

yürütülür yani - Dizi iki kez numaralandırılmış olarak bu optimal değildir.

Sen * Eğer arr.map {$ 0 `gibi, zincir` map` can, "" adlı `map` içindeki şeyler yapmak gerekmez

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

Düşünüyorum @ sketchyTech'in cevabı, OP'nin zincirlenebilirliği ararken doğru olması gerekiyordu. sen. Ancak, optimizasyon hakkında doğru. Her ikisine de +1. – thesummersign

0

Array işlevini genişletmeniz gerekiyor. Nokta operatörü sınıf veya yapı yöntemlerini çağırır. Kendi işlevin Array yapısına kadar genişletin.

2

Haritanız Int dizisini döndürerek, nokta sözdizimini kullanarak Array<Int> üzerinde gerçekleştirilebilecek herhangi bir Array yöntemini uygulayabilirsiniz. Kendi yöntemlerinizi dahil etmek için, Array numaranızı bu şekilde mümkün olan bir şekilde uzattığınızdan emin olun, örn. Burada protokol kısıtlamaları kullanmadıysanız herhangi türde bir dizi olabilir çünkü

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] 

sonra, bir eksi 1 işlemi gerçekleştirmek mümkün olmaz.