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

3
starLabel.snp.makeConstraints { make in
    make.left.equalTo(starImageView.snp.right).offset(5)
    make.centerY.equalToSuperview()
}

starImageViewstarLabel是当前视图控制器的属性。但是,为什么我可以在makeConstraints中的闭包中忽略self(self.starImageView)呢?

而在我的闭包中,我必须明确写出self,否则编译器会报错:

在闭包中引用属性'starImageView'需要明确的'self.'来表明捕获语义

插入'self.'

enter image description here

2个回答

2
public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
        ConstraintMaker.makeConstraints(item: self.view, closure: closure)
}

因为该闭包未标记为 @escaping,所以它只会在函数内运行。当函数结束时,该闭包将被释放。只有函数可以持有该闭包。


-1

这是因为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? (我认为它不必是可选的)都不需要通过 self 来访问。因此,你放入 equalTo 函数中的任何内容都被 snapKit 视为 AnyObject?,因此不需要 self 引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接