我对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)中所述的对象中,但是没有用。
对于如何克服这个问题,或者我做错了什么,我会很感激。
答案 0 :(得分:0)
在Dan的评论之后进行调查后,看来enum var在执行异步块之前被重置为原始值。