объявление функций в swift с использованием синтаксиса замыкания - PullRequest
0 голосов
/ 26 августа 2018

Чтение через Advanced Swift, и это дает следующий пример

«В Swift вы можете определять функции двумя способами. Один с ключевым словом func. Другой способ - использовать закрывающее выражение. Рассмотрим эту простую функцию для удвоения числа:

func doubler(i: Int) -> Int {
    return i * 2
}
[1, 2, 3, 4].map(doubler) // [2, 4, 6, 8]

А вот та же функция, написанная с использованием синтаксиса выражения замыкания. Как и раньше, мы можем передать его на карту:

let doublerAlt = { (i: Int) -> Int in return i*2 }
[1, 2, 3, 4].map(doublerAlt) // [2, 4, 6, 8]”

Я поиграл с этим и написал следующий код в классе ячеек представления коллекции.

let setupView = {(label: UILabel) in
    addSubview(label)
    label.topAnchor.constraint(equalTo: topAnchor).isActive = true
    label.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    label.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    label.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
}

func setupViews(label: UILabel) {
    addSubview(label)
    label.topAnchor.constraint(equalTo: topAnchor).isActive = true

    label.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    label.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    label.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
}

Верхний выводит мне ошибки, а нижний с использованием ключевого слова func работает нормально. Я думаю, они оба должны работать. Мне интересно, если кто-то сможет объяснить.

1 Ответ

0 голосов
/ 26 августа 2018

Закрытие закрыто , поэтому вы не можете получить доступ к вещам вне закрытия внутри замыкания по умолчанию.

self - это что-то вне замыкания, поэтому вам нужно захватите , чтобы использовать его внутри крышки.Вы не захватили self, поэтому вы не можете позвонить self.addSubView.

self - это особый случай.Чтобы захватить его, вам просто нужно записать его явно:

self.addSubView(label)
// and
self.topAnchor
self.leftAnchor
// etc

Однако, это вызовет цикл сохранения.Закрытие постоянно содержит строгую ссылку на self, а self постоянно содержит строгую ссылку на закрытие.Ни один не может быть освобожден.Поэтому вы должны захватить self с unowned:

lazy var setupView = {[unowned self] (label: UILabel) in
    self.addSubview(label)
    label.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
    label.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
    label.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
    label.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
}
...