2015-12-14 14 views
12

Nehmen wir diese Situation an: Ich habe ein Array von Objekten, und ich möchte die Instanzmethode auf jedem von ihnen aufrufen. Ich kann so etwas tun:Aufrufen der Instanzmethode für jedes Objekt in Array

//items is an array of objects with instanceMethod() available 
items.forEach { $0.instanceMethod() } 

Die gleiche Situation ist mit map. Zum Beispiel möchte ich mit mappingInstanceMethod jedes Objekt, um etwas anderes kartieren, die Wert zurückgibt:

let mappedItems = items.map { $0.mappingInstanceMethod() } 

Gibt es eine sauberere Möglichkeit, das zu tun?

Zum Beispiel in Java kann man tun:

items.forEach(Item::instanceMethod); 

statt

items.forEach((item) -> { item.instanceMethod(); }); 

Ist similiar Syntax in Swift verfügbar?

+1

Wenn ich Ihre Frage richtig verstanden hat, dann ist es hier beantwortet: [? Gibt es eine Möglichkeit Instanz Funktion zu verweisen, wenn SequenceType.forEach Aufruf] (http://stackoverflow.com/questions/34049116/ is-there-a-way-zu-Referenz-Instanz-Funktion-wenn-Aufruf-Sequenztyp-foreach). - Und die kurze Antwort ist "nein", Sie können nicht einfach "items.forEach (Item.instanceMethod)" in Swift aufrufen, da die Parameter der Curry-Funktion in der falschen Reihenfolge sind. –

+1

... mit anderen Worten: was du machst ist schon ein sauberer Swifty Weg. –

Antwort

25

Was machst du in

items.forEach { $0.instanceMethod() } 
let mappedItems = items.map { $0.mappingInstanceMethod() } 

ist eine saubere und Swifty Weg. Wie in Is there a way to reference instance function when calling SequenceType.forEach? erläutert, kann die erste Anweisung nicht zu

items.forEach(Item.instanceMethod) 

reduziert werden mit einer Ausnahme allerdings ist: Es funktioniert mit init Methoden die ein einziges Argument. Beispiel:

let ints = [1, 2, 3] 
let strings = ints.map(String.init) 
print(strings) // ["1", "2", "3"] 
1
for item in items { 
     item.instanceMethod() 
    } 
+0

Ok, vielleicht hätte ich genauer sein sollen. Ich möchte eine Verschlusssyntax, die zB auch in der map-Funktion verwendet werden kann. –

1

haben Sie

let mappedItems = items.map { $0.mappingInstanceMethod() } 

Note die () versucht, die Methode

Edit 1 zu nennen: Code

Beispiel:

class SomeObject { 

    func someFunction() -> Int { 
     return 5 
    } 
} 

let array = [SomeObject(), SomeObject(), SomeObject()] 

let ints = array.map { $0.someFunction()} 
print(ints) 
+0

Es war nur ein Tippfehler, ich habe es behoben. –

+0

Wenn [dies] (http://imgur.com/mLr9iq6) ist was du meinst es funktioniert – tmpz

+0

Ich weiß, dass es funktioniert, ich suchte nur nach anderen Syntax dafür. Wie @MartinR in seinen Kommentaren darauf hingewiesen hat, ist dies der "schnellste" Weg, dies zu tun, und es gibt keinen kürzeren Weg. –

Verwandte Themen