2017-10-20 22 views
1

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.

+1

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

+0

@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

Répondre

0

Il apparaît, après enquête suite au commentaire de Dan, que la variable enum était réinitialisée à la valeur d'origine avant l'exécution du bloc asynchrone.