#swift #xcode #function #closures
#swift #xcode #функция #закрытие
Вопрос:
Я запустил следующий код в Xcode Swift Playground:
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true // (2 times)
}
}
return false
}
func isOdd(number: Int) -> Bool {
return number % 2 != 0 // (2 times)
}
var numbers = [20, 19, 7, 12] // [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: isOdd) // true
hasAnyMatches(list: numbers, condition: { $0 % 2 != 0 }) // (3 times)
В комментариях справа показаны выходные данные Xcode Playground.
Первые четыре вывода имеют смысл: 19 — второе число в списке, поэтому функция isOdd() вычисляется дважды, а функция hasAnyMatches() выдает значение true .
Чего я не понимаю, так это пятого вывода, когда isOdd() заменяется на закрытие { $ 0 % 2 != 0 }:
(a) почему это «(3 раза)», а не «true», как в строке выше?
(b) почему он оценивается (3 раза) вместо (2 раза)?
Ответ №1:
Это потому, что игровая площадка записывает (x times)
, когда хочет вывести несколько объектов в одной строке.
Вы получили (3 times)
при использовании замыкания, потому что Xcode хочет напечатать 3 вещи:
- Первый вызов закрытия
- Второй вызов закрытия
hasAnyMatches
возвращаемое значение
Это становится более понятным, когда вы помещаете закрытие в новую строку:
hasAnyMatches(list: numbers, condition: { // true
$0 % 2 != 0 // (2 times)
})
Комментарии:
1. Спасибо за объяснение, теперь все имеет смысл. Отличный совет по переносу закрытия на новую строку.