Оценка быстрого закрытия функции Xcode Playground

#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. Спасибо за объяснение, теперь все имеет смысл. Отличный совет по переносу закрытия на новую строку.