为什么SnapKit在函数`makeConstraints`中的闭包中没有`self`?

问题描述 投票:2回答:1
starLabel.snp.makeConstraints { make in
    make.left.equalTo(starImageView.snp.right).offset(5)
    make.centerY.equalToSuperview()
}

starImageViewstarLabel是当前视图控制器的属性。但是,为什么我可以忽略封闭中的selfself.starImageView),这是makeConstraints中的参数?

在我的闭包中,我必须明确地编写self,否则编译器将报告错误:

在闭包中引用属性'starImageView'需要明确的'self'。使捕获语义显式化

插入'自我'。

enter image description here

ios swift closures snapkit
1个回答
0
投票

这是因为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参考。

© www.soinside.com 2019 - 2024. All rights reserved.