cui-unige / outils-formels-modelisation

Cours de Bachelor : Outils Formels de Modélisation
20 stars 44 forks source link

Probleme avec la syntaxe... #19

Closed consolethinks closed 6 years ago

consolethinks commented 6 years ago

Je voudrais extraire UInt depuis un Covertability Marking dans le code suivant:

public func fireCover(from marking: CoverabilityMarking) -> CoverabilityMarking? {
      guard self.isFireableCover(from: marking) else {
          return nil
      }

      var result = marking
      for arc in self.preconditions {
        switch result[arc.place] {
        case .some(let x): // <- C'est la partie qui ne marche pas
          var temp: UInt = x//-arc.tokens
          result[arc.place]! = .some(temp)
        default:
          break
        }
      }
      for arc in self.postconditions {
        switch (result[arc.place]){
        case (.some(let x)):
          result[arc.place]! = .some(x+arc.tokens)
        default:
          break
        }
      }

      return result
  }

Le compilateur m'envoit un erreur de type incompatible 'Token' et 'UInt'

kyouko-taiga commented 6 years ago

Le problème est que tu as fait ton switch sur le résultat de result[arc.place]. result est de type [PTPlace: Token], donc son subscript est de type Token?. Lorsque tu fais .some(let x) tu unwrap Token?, c'est-à-dire Optional<Token> et pas Token.

Peut-être que le code suivant clarifiera le problème:

enum Optional<T> {
  case some(T)
  case none
}

enum Token {
  case some(UInt)
  case omega
}

let x: Optional<Token> = .some(.some(5))

switch x {
case .some(let a):
  // a has type Token
  break
case .some(.some(let a)):
  // a has type UInt
  break
default:
  break
}