2015-12-14 86 views
12

讓我們假設這種情況:我有一個對象數組,並且我希望每個對象都有一個調用實例方法。我可以這樣做:在數組中的每個對象上調用實例方法

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

map相同的情況是。比如我要地圖的每個對象與mappingInstanceMethod別的返回值:

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

有一個更清潔的方式來做到這一點?

例如在Java中一個可以做:的

items.forEach(Item::instanceMethod); 

代替

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

類同語法提供斯威夫特?

+1

如果我正確理解你的問題,那麼就在這裏找到答案:?有沒有打電話SequenceType.forEach時參考實例函數的方式(http://stackoverflow.com/questions/34049116/是,有-A-方式對參考實例函數時,主叫序列類型-的foreach)。 - 簡短回答是「否」,因爲curried函數的參數順序錯誤,所以不能「簡單地」在Swift中調用items.forEach(Item.instanceMethod)'。 –

+1

......換句話說:你在做什麼已經是一個乾淨的Swifty方式。 –

回答

25

你在做什麼

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

是一個乾淨和Swifty的方式。正如Is there a way to reference instance function when calling SequenceType.forEach?解釋,第一條語句不能減少 到

items.forEach(Item.instanceMethod) 

有一個例外,但:它的工作原理與init方法 這需要一個參數。例如:

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

好吧,也許我應該更具體。我想要閉包語法,例如,它也可以在'map'函數中使用。 –

1

你試過

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

注意()調用的方法

編輯1:

示例代碼:

class SomeObject { 

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

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

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

這只是一個錯字,我修好了。 –

+0

如果[this](http://imgur.com/mLr9iq6)是你的意思,它的工作原理 – tmpz

+0

我知道它的工作原理,我只是在尋找其他語法。正如@MartinR在他的評論中指出的那樣,這是做到這一點的'最迅速'的方式,並且沒有更短的方式可用。 –

相關問題