gpt4 book ai didi

swift - 在 Swift 中评估定义 block 内的枚举

转载 作者:行者123 更新时间:2023-11-28 08:00:16 24 4
gpt4 key购买 nike

我是 Swift 的新手(过去 6 年使用 Objective-C),在计算 block 内的 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 并运行 block ,但是,当 myBlock block 计算后,将使用旧值(.type1 而不是 .type2)。因此,代码执行总是落入 print("Do Nothing") 行。

我相信枚举在 Swift 中是按值复制的,所以我也曾尝试将它们包装在一个对象中,如这篇 StackOverflow 帖子 (How to store a reference to an integer in Swift) 中所述,但无济于事。

如果我能得到一些关于如何克服这个问题的建议,或者如果我做错了什么,我将不胜感激。

最佳答案

根据 Dan 的评论进行调查后,似乎枚举变量在执行异步 block 之前被重置为原始值。

关于swift - 在 Swift 中评估定义 block 内的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46852021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com