2015-12-14 13 views
12

Supponiamo che questa situazione: Ho una matrice di oggetti e voglio il metodo di istanza di chiamata su ciascuno di essi. Posso fare qualcosa di simile:Chiamare il metodo di istanza su ogni oggetto nell'array

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

La stessa situazione è con map. Ad esempio voglio mappare ogni oggetto a qualcos'altro con mappingInstanceMethod che restituisce valore:

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

C'è un modo più pulito per farlo?

Per esempio in Java si può fare:

items.forEach(Item::instanceMethod); 

invece di

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

è la sintassi simile disponibile in Swift?

+1

Se ho capito bene la tua domanda, allora si risponde qui: [? C'è un modo per fare riferimento funzione di esempio quando si chiama SequenceType.forEach] (http://stackoverflow.com/questions/34049116/ è-ci-a-way-to-riferimento-esempio-funzione-quando-chiamante SequenceType-foreach). - E la risposta breve è "no", non è possibile "semplicemente" chiamare 'items.forEach (Item.instanceMethod)' in Swift perché i parametri della funzione al curry sono nell'ordine sbagliato. –

+1

... in altre parole: quello che stai facendo è già un modo pulito Swifty. –

risposta

25

Quello che state facendo in

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

è un modo pulito e Swifty. Come spiegato nel Is there a way to reference instance function when calling SequenceType.forEach?, la prima affermazione non può essere ridotta a

items.forEach(Item.instanceMethod) 

C'è un'eccezione però: Funziona con init metodi che prende un singolo argomento. Esempio:

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, forse avrei dovuto essere più specifico. Voglio la sintassi di chiusura che può essere utilizzata anche nella funzione 'map', per esempio. –

1

Hai provato

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

nota la () per chiamare il metodo

Edit 1:

codice di esempio:

class SomeObject { 

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

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

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

Era solo un errore di battitura, l'ho risolto. –

+0

Se [questo] (http://imgur.com/mLr9iq6) è ciò che significa che funziona – tmpz

+0

So che funziona, stavo solo cercando un'altra sintassi per questo. Come ha sottolineato @MartinR nei suoi commenti, questo è il modo più "snodo" per farlo e non esiste una via più breve. –

Problemi correlati