【问题标题】:declaring functions in swift using the closure syntax使用闭包语法在 swift 中声明函数
【发布时间】:2019-02-01 02:11:28
【问题描述】:

阅读 Advanced 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 关键字的效果很好。我认为他们都应该工作。我想知道是否有人可以解释一下。

【问题讨论】:

标签: swift closures


【解决方案1】:

闭包是关闭的,所以默认情况下你不能在闭包内部访问闭包之外的东西。

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

self 是一种特殊情况。要捕获它,你只需要明确地写出来:

self.addSubView(label)
// and
self.topAnchor
self.leftAnchor
// etc

但是,这将导致一个保留周期。闭包一直持有对self 的强引用,self 一直持有对闭包的强引用。两者都不能被释放。因此,您应该使用unowned 捕获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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
相关资源
最近更新 更多