Почему в замыкании функции `makeConstraints` от SnapKit нет` self`? - PullRequest
0 голосов
/ 07 сентября 2018
starLabel.snp.makeConstraints { make in
    make.left.equalTo(starImageView.snp.right).offset(5)
    make.centerY.equalToSuperview()
}

starImageView и starLabel являются свойствами текущего контроллера вида. Но почему я могу игнорировать self (self.starImageView) в замыкании, которое является параметром в makeConstraints?

И в моем закрытии я должен написать self явно, иначе компилятор сообщит об ошибке:

Ссылка на свойство starImageView при закрытии требует явного 'self'. сделать семантику захвата явной

Вставить «себя».

enter image description here

1 Ответ

0 голосов
/ 07 сентября 2018

Это потому, что equalTo выглядит так:

public func equalTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {
    return self.relatedTo(other, relation: .equal, file: file, line: line)
}

И ConstraintRelatableTarget - это протокол, который приводит к различным типам, таким как Int, Float и т. Д. У вас также есть ссылка на ConstraintItem, в данном случае это тот вид, на который вы ссылаетесь, и он выглядит так:

internal weak var target: AnyObject?
internal let attributes: ConstraintAttributes

internal init(target: AnyObject?, attributes: ConstraintAttributes) {
    self.target = target
    self.attributes = attributes
}

internal var layoutConstraintItem: LayoutConstraintItem? {
    return self.target as? LayoutConstraintItem
}

Как оказалось, и Any?, и AnyObject? (я не думаю, что это необязательно), для достижения себя не нужно. Следовательно, все, что вы вставляете в функцию equalTo, snapKit воспринимается как AnyObject?, поэтому ссылка на self не требуется.

...