评估Swift中已定义块内的枚举

时间:2017-10-20 15:05:34

标签: swift enums

我对Swift相当新(过去6年的Objective-C),在评估块内的Enum值时遇到了一些问题。最好的展示方式就是一个例子。

enum MyType {
    case type1
    case type2
}

class MySuperClass {
    var type: MyType
    var object: SomeObject

    init(param: SomeObject) {
        self.type = .type1
        self.object = param
    }

    public func doSomething(handler block: @escaping (AnyObject) -> Void) {
        self.type = .type2
        // assign handler block to property, blah blah
        object.execHandler(forMethod: "testing", completion: { (response) -> Void in
            block(response)
        })
    }

    public func reset() {
        self.type = .type1
    }
}

class MySubClass: MySuperClass {

    override init(param: SomeObject) {
        super.init(param: param)

        let myBlock: MyBlockType = { (responseObject) -> Void in
            // do some stuff

            // ISSUE ARISES HERE
            switch self.type {
                case .type2:
                    print("Is type2")
                default:
                    print("Do Nothing")
            }
        };
        object.addHandler(forMethod: "testing", processBlock: myBlock)
    }

}

然后在使用它时,我只是做这样的事情:

let myObject = MySubClass(param: passingInAnObject) // the block is defined and setup (this sets the 'type' to .type2) 
myObject.doSomething(handler: { (responseObject) -> Void in
    print("completed")
})
// do some other stuff
// ...
object.reset()

可以看出,doSomething方法会将枚举设置为.type2并运行块,但是,当评估myBlock块时,将使用旧值({ {1}}不是.type1)。因此,代码执行始终属于行.type2

我相信枚举是在Swift中按值复制的,所以我也尝试将这些包装在StackOverflow帖子(How to store a reference to an integer in Swift)中所述的对象中,但是没有用。

对于如何克服这个问题,或者我做错了什么,我会很感激。

1 个答案:

答案 0 :(得分:0)

在Dan的评论之后进行调查后,看来enum var在执行异步块之前被重置为原始值。