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'。使捕获语义显式化
插入'自我'。
这是因为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
参考。