2017-09-03 3 views
1

Ich habe einige Fortschritte in meiner App gemacht, um RoShambo zu spielen, bin aber auf eine bestimmte Sache gestoßen. In einem ViewController habe ich zwei Eigenschaften der Klasse festgelegt. Ich möchte, dass sie Ganzzahlen sind, weil ich später in der Klasse mit Ganzzahlen eine switch-Anweisung verwende. Ich erhalte jedoch einen Fehler, wenn ich ganze Zahlen verwenden sagen:So verwenden Sie optionale Ints in einer Switch-Anweisung

"Class 'ResultsViewController' has no initializers" 
"stored property 'your play' without initial value prevents synthesized initializers" 

Nun, diese Fehler weggehen, wenn ich meine gespeicherten Eigenschaften optionals machen, aber dann habe ich Fehler auf meiner switch-Anweisung bekommen, weil es ganze Zahlen verwendet, nicht optionals.

Also habe ich zwei Fragen: 1) In der switch-Anweisung, die ich unten habe, wie würde ich Werte des Typs "Int?" in einer switch-Anweisung?

2) Wenn meine optionalen Werte null sind, wie kann ich das Programm beenden und die switch-Anweisung nicht ausführen, da es keinen Sinn ergibt, den Vergleich durchzuführen?

import Foundation 
import UIKit 

class ResultsViewController: UIViewController { 

// MARK: Properties 

var opponentPlay: Int? 
var yourPlay: Int? 

//Mark: Outlets 

@IBOutlet weak var MatchResult: UILabel! 
@IBOutlet weak var PlayAgainButton: UIButton! 


//Mark: Life Cycle 

    override func viewWillAppear(_ animated: Bool){ 
     //unwrap optional properties 
     if let opponentPlay = opponentPlay { 
      print("good play") 
     } else { 
      print("opponentPlay is nil") 

     } 

     if let yourPlay = yourPlay { 
      print("good play") 
     } else { 
      print("opponentPlay is nil") 
     } 


    switch (opponentPlay, yourPlay) { 
     case (1, 1), (1, 1), (2, 2), (2, 2), (3, 3), (3, 3): 
      self.MatchResult.text = "You Tie!" 
     case (1, 2): 
      self.MatchResult.text = "You Win!" 
     case (2, 1): 
      self.MatchResult.text = "You Lose!" 
     case (1, 3): 
      self.MatchResult.text = "You Lose!" 
     case (3, 1): 
      self.MatchResult.text = "You Win!" 
     case (2, 3): 
      self.MatchResult.text = "You Win!" 
     case (3, 2): 
      self.MatchResult.text = "You Lose!" 
     default: 
      break 
    } 
+0

Überprüfen Sie bitte [diesen Thread] (https://stackoverflow.com/q/37452118/6541007). – OOPer

Antwort

1

Sie können mit ? auspacken. Sie können auch where Klauseln hinzufügen, wenn Sie jede Permutation aufzuzählen nicht wollen, ob Sie gewinnen und wo Sie verlieren:

switch (opponentPlay, yourPlay) { 
case (nil, nil): 
    print("both nil") 
case (nil, _): 
    print("opponent score nil") 
case (_, nil): 
    print("yours is nil") 
case (let opponent?, let yours?) where opponent == yours: 
    matchResult.text = "tie" 
case (let opponent?, let yours?) where opponent > yours: 
    matchResult.text = "you win" 
case (let opponent?, let yours?) where opponent < yours: 
    matchResult.text = "you lose" 
default: 
    fatalError("you should never get here") 
} 
1

ich diesen Code ähnlich wie bei Ihnen ausgeführt haben und es nicht zu Fehlern. Ich weiß wirklich nicht, ob Schalter Optionals akzeptiert, aber ich denke in diesem Fall ist es auch nicht notwendig. Ich hoffe, es wird dir nützlich sein.

var opponentPlay: Int? 
var yourPlay: Int? 
var matchResult = "" 

func play(){ 
    if let opponentPlay = opponentPlay , let yourplay = yourPlay { 
    switch (opponentPlay,yourplay) { 
    case (1,1): 
     matchResult = "You tie" 
    default: 
     break 
    } 
    } 
} 
Verwandte Themen