使用闭包语法在swift中声明函数

使用闭包语法在swift中声明函数,swift,closures,Swift,Closures,阅读高级Swift,并给出以下示例 在“SWIFT”中,可以用两种方式定义函数:一种是FUNC关键字,另一种是使用闭包表达式。 func doubler(i: Int) -> Int { return i * 2 } [1, 2, 3, 4].map(doubler) // [2, 4, 6, 8] 下面是使用闭包表达式语法编写的相同函数。与前面一样,我们可以将其传递给map: let doublerAlt = { (i: Int) -> Int in return i*2

阅读高级Swift,并给出以下示例

在“SWIFT”中,可以用两种方式定义函数:一种是FUNC关键字,另一种是使用闭包表达式。
func doubler(i: Int) -> Int {
    return i * 2
}
[1, 2, 3, 4].map(doubler) // [2, 4, 6, 8]
下面是使用闭包表达式语法编写的相同函数。与前面一样,我们可以将其传递给map:

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关键字可以很好地工作。我认为它们应该都可以工作。我想知道是否有人可以解释。

一个闭包是关闭的,因此默认情况下,您无法访问闭包内部的闭包之外的内容

self
是闭包之外的东西,因此您需要捕获它才能在闭包内使用它。您没有捕获
self
,因此无法调用
self.addSubView

self
是一种特殊情况。要捕获它,只需显式地写出它:

self.addSubView(label)
// and
self.topAnchor
self.leftAnchor
// etc
但是,这将导致一个保留周期。闭包始终保持对
self
的强引用,而
self
始终保持对闭包的强引用。两者都不能解除分配。因此,您应该使用
无主
捕获
self

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
}

这可能会有帮助-锚点不也需要
self
吗?:x