Функции, замыкания помогите разобраться


#1

Привет! помогите разобраться с заданием. Используя замыкание нужно найти максимальный и минимальный элементы массива
Код рабочий, честно списанный)
Объясните, пожалуйста , как это работает.

let arrayOfInts = [-104, 5, 30, 1, 22, 4, 67, 1002]

func sortFunc (array: [Int], closure: (Int?, Int) -> Bool) -> Int {
    
    var tempVar: Int? = nil
    
    for value in array {
        if closure (tempVar, value) {
            tempVar = value
        }
    }
    return tempVar!
}
print (sortFunc(array: arrayOfInts) {($0 != nil) ? $0! < $1 : true})

print (sortFunc(array: arrayOfInts) {($0 != nil) ? $0! > $1 : true})

//Хоть убей, не понимаю вот это:

if closure (tempVar, value) {
tempVar = value

то есть как я понимаю, if должен проверять истинность условия. Какое условие проверяется здесь, мне не понятно!
Что проверяется? Что в замыкание closure передается два инта? Блин)))
чушь какая-то…
Помогите, плз.


#2
let closure1 = {
	text in
	print("text 1: " + text)
}

let closure2 = {
	text in
	print("text 2: " + text)
}

var closure = closure1

closure("text1") // text 1: text1

closure = closure2

closure("text2") // text 2: text2

а если так?


#3

Спс!
Но мне не понятен мой код, а конкретно вот это:

if closure (tempVar, value) {
tempVar = value

то есть мне нужен перевод со свифта на русский как это работает, логику, что ли, вот этого кода))


#4

[quote=“kosty, post:1, topic:3084”]
Какое условие проверяется здесь, мне не понятно!
[/quote]такое ($0 != nil) ? $0! < $1 : true
оно прописано здесь print (sortFunc(array: arrayOfInts) {($0 != nil) ? $0! < $1 : true})
шпоргалка по синтаксису замыканий http://goshdarnclosuresyntax.com/


#5

Спс! попробую вникнуть…


#6

Попробую разложить все как я это вижу:
в функцию sortFunc передается массив arrayOfInts
и в замыкание closure передается такое условие:
если $0 не равен нил тогда $0 будет меньше $1, иначе true
вроде все так…
потом начинает работать тело функции:
tempVar равна нил
теперь цикл:
ну допустим в value попадает -104 и начинает проверятся условие if, которое в свою очередь должно выполнить действие - присвоить tempVar переменную value, если выполнится условие, а если условие не выполнится, то действий никаких не будет.
Начинает работать замыкание closure, в которое мы передали ({($0 != nil) ? $0! < $1 : true})
правильно?
если $0 равен нил, а это tempVar, который равен нил, тогда closure выполняет true (второе действие тернарного оператора) и tempVar становится равен value то есть -104

и теперь sortFunc возвращает tempVar который равен -104.
так, что ли?))
потом следующий виток функции.
начнем сразу с тела функции sortFunc
теперь в value попадает, ну допустим, 5 из массива.
В if closure теперь такие параметры tempVar равный -104 и value равный 5.
так? так

начинает отрабатывать {($0 != nil) ? $0! > $1 : true})
где $0 теперь не равен нил, а равен -104 а value 5 и срабатывает $0! > $1 тернарного оператора (первое действие)
то есть проверяется (-104 больше 5) ответ: нет, следовательно в конструкции if действие вернет false, а так как false, то if не выполнится и в tempVar не запишется новое значение value, а останется -104
и так далее, сравнивая все друг с другом…
Поправьте, пожалуйста, что не так…


#7

[quote=“kosty, post:6, topic:3084”]
Поправьте, пожалуйста, что не так…
[/quote]все правильно

так же, для поиска наибольшего\наименьшего элемента, можно использовать reduce:
// 3 – Найти max(min) элемент в массиве
print(“max: (array.reduce(array[0]) { $0 < $1 ? $1 : $0 })”); // max
print(“min: (array.reduce(array[0]) { $0 > $1 ? $1 : $0 })”); // min

еще у массива есть функция min/max:
let min = arrayOfInts.min(by: {a, b in a < b})


#8

Спасибо за ответы, помогло разобраться!