Нужно небольшое "вправление мозгов" по closures

xcode

#1

Вот пример из первого курса по Closure:

let unsortedArray = [123,345,56,56,345,567,567,989,90,798,45,23,12,23]

let sortedArray = unsortedArray.sorted {
(number1: Int, number2: Int) -> Bool in
return number1 > number2
}

При выполнении клоужера, справа в плейграунде появляется запись - (42 times)

То есть, тело клоужера выполнилось циклично 42 раза, но при этом я не понимаю, что его вынудило совершить цикличное вычисление. Объясните плс, что заставляет код внутри клоужера выполняться циклично, при отсутствии явного оператора цикла?


#2
let unsortedArray = [123, 345, 56, 56, 345 ,567, 567, 989, 90, 798, 45, 23, 12, 23]

extension Array {
    func mySorted(_ closure: (Element, Element) -> Bool) -> [Element] {
        var result = self
        for i in result.startIndex..<result.endIndex - 1 {
            for j in result.startIndex..<result.endIndex - i - 1 where closure(result[j + 1], result[j]) {
                (result[j + 1], result[j]) = (result[j], result[j + 1])
            }
        }
        return result
    }
}

let sortedArray = unsortedArray.mySorted { number1, number2 in
    return number1 > number2
}

print(sortedArray)


#3

то есть, в случае с методом .sorted это именно он обеспечивал циклическое действие?


#4

Да, он вызывает замыкание много раз и сортирует в зависимости от возвращаемого результата.


#5

а как можно сделать вывод, что тот или иной метод сам по себе выполняется многократно?


#6

Метод выполняется один раз, он несколько раз вызывает замыкание. Вывод можно сделать по тому как работает метод, необязательно знать его реализацию, просто нужно знать как он работает, например filter или map один раз пройдут по массиву (вызовут замыкание по количеству элементов массива, для каждого элемента соответственно). Такое из чистой логики понятно :slight_smile:

let array = [-1, 0, 2]

_ = array.filter { i in
    print(i)
    return i > 0
}

_ = array.map { i -> Double in
    print(i)
    return Double(i)
}


#7

спасибо, буду думать )