提问者:小点点

在Swift 3.0中转义闭包内变异self(struct/enum)


在swift 2.2中,我们可以在闭包中对结构或枚举进行变异,当它在变异函数中时。但在swift 3.0中,它不再可能。我得到以下错误

闭包不能隐式捕获变异的自身参数

这是一个代码片段,

struct Point {
    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY

        test { (a) -> Void in
            // Get the Error in the below line.
            self.x = Double(a)
        }

    }

    mutating func test(myClosure: @escaping (_ a: Double) -> Void) {
        myClosure(3)
    }
}

我知道值类型不应该是可变的。我有一些情况,当我收到API响应时,我必须在其中一个函数的结构中修改一个变量。(在完成闭包中)

我在swift 2.2中所做的是不可能的,还是有办法做到这一点?


共3个答案

匿名用户

问题是可以存储@转义闭包以供以后执行:

逃逸关闭

当闭包作为参数传递给函数时,称为闭包转义函数,但在函数返回后调用。…

闭包可以转义的一种方法是存储在函数外部定义的变量中……

由于闭包可以在函数范围之外存储和生存,因此闭包(self)内部的struct/enum将被复制(它是一个值)作为闭包的参数。并且,如果允许它发生突变,闭包可能会有它的旧副本,从而导致不需要的结果。

所以,在回答你的问题时,你不能;除非你能够删除“@转义”(不是你的情况,因为它是第三方API)

匿名用户

是的,你可以做这样的事情。

struct Point {

    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY

        test { (a) -> Void in

            self.x = Double(a)
        }
    }

    mutating func test(myClosure: (_ a: Double) -> Void) {
        myClosure(3)
    }
}

匿名用户

结构是值类型。因此,当用作模型或模型视图时,您可以使用新的值来VC闭包。

struct Point {
    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY

        test { [x, y](a) -> Point in
            // Get the Error in the below line.
            return Point(x: Double(a), y: y)
        }

    }

    mutating func test(myClosure: @escaping (_ a: Double) -> Point) {
        self = myClosure(3)
    }
}