Вызов метода экземпляра для каждого объекта в массиве
Предположим, что у меня есть массив объектов, и я хочу, чтобы метод экземпляра вызова выполнялся на каждом из них. Я могу сделать что-то вроде этого:
//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(); });
Совместимый синтаксис доступен в Swift?
Ответы
Ответ 1
Что вы делаете в
items.forEach { $0.instanceMethod() }
let mappedItems = items.map { $0.mappingInstanceMethod() }
- чистый и аккуратный способ. Как объясняется в Есть ли способ ссылаться на функцию экземпляра при вызове SequenceType.forEach?, первое утверждение не может быть уменьшено
до
items.forEach(Item.instanceMethod)
Есть одно исключение: оно работает с методами init
которые принимают один аргумент. Пример:
let ints = [1, 2, 3]
let strings = ints.map(String.init)
print(strings) // ["1", "2", "3"]
Ответ 2
for item in items {
item.instanceMethod()
}
Ответ 3
Вы пробовали
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)