Задачки
November 8

Задачка на эффективное использование замыканий

👋 В этой статье рассмотрим задачу, связанную с эффективным использованием замыканий в языке Swift. Это не только поможет вам лучше понять, как работают замыкания, но и продемонстрирует их взаимодействие со значениями и ссылками.

Задача: Дана структура Product, которая имеет два свойства: x и y, а также вычисляемое свойство result, которое возвращает произведение x и y. Инициализатор принимает два параметра этих свойств.

struct Product {
    var x: Int
    var y: Int
    
    var result: Int {
        return x * y
    }
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

Создадим экземпляр Product, задав значения x равным 7 и y равным 8.

var product = Product(x: 7, y: 8)

Теперь объявим несколько замыканий и изменим значение свойства y на 10.

let closure1 = { [product] in
    print("Result for closure1 is \(product.result)")
}

let closure2 = { [product]
    print("Result for closure2 is \(product.result)")
}

let closure3 = { product
    print("Result for closure3 is \(product.result)")
}

let closure4 = {
    print("Result for closure4 is \(product.result)")
}

product.y = 10

Теперь давайте подумаем, что будет выведено в результате вызова этих замыканий:

closure1()
closure2()
closure3()
closure4()

Какой результат вы ожидаете? Попробуйте заранее записать свои мысли и ответы.

Интересно также выяснить, как поведут себя замыкания, если заменить структуру Product на класс. Проанализируйте, как ссылочные типы обрабатываются в Swift, и сделайте выводы относительно работы со значениями и ссылками.

Для эффективности рекомендую сначала обдумать свои ответы и записать их в комментариях, прежде чем сверяться с правильными ответом в Playground.

Если у вас возникнут вопросы по задаче, не стесняйтесь задавать их в комментариях. Также для дополнительной поддержки можно ознакомиться с моей статьей "Как управлять захватом переменных в Swift с помощью Capture Lists", где разбираются аналогичные кейсы.