Je suis relativement nouveau dans Swift (Objective-C depuis 6 ans) et j'ai un léger problème lors de l'évaluation d'une valeur Enum dans un bloc. La meilleure façon de démontrer est ceci avec un exemple. Cependant,Évaluation des énumérations dans des blocs définis dans Swift
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()
Comme on le voit, la méthode doSomething
définira l'ENUM à .type2
et exécuter le bloc, lorsque:
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)
}
}
Puis lors de l'utilisation, je suis tout simplement faire quelque chose comme ça le bloc myBlock
est évalué, l'ancienne valeur est utilisée (.type1
et non .type2
). Ainsi, l'exécution du code tombe toujours dans la ligne print("Do Nothing")
. Je crois que les enums sont copiés par valeur dans Swift, donc j'ai aussi essayé de les emballer dans un objet comme indiqué dans ce post de StackOverflow (How to store a reference to an integer in Swift), mais sans succès.
J'apprécierais quelques conseils sur la façon de surmonter cela, ou si je fais quelque chose de mal.
Vous appelez probablement 'object.reset()' avant l'exécution de 'myBlock', en supposant qu'il soit appelé après l'exécution asynchrone de quelque chose. – dan
@dan bien n'est pas si embarrassant ... que 'object.reset()' devrait être dans le gestionnaire d'achèvement. J'aurais dû voir ça plus tôt. Merci!!! – Taz