2016-10-11 7 views
0

私はプログラミングではかなり新しいですが、それ以外の構造をSwift言語のスイッチケースに変換しようとしています。このように、ここで他の構造をスウィフトのスイッチケースに変換する

は私のコードは

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "ShowDefinition") { 
     if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
      if let definition = sender as? String { 
       if definition == "Abstraction" { 
        destinationViewController.titleMsg = "Abstraction" 
        destinationViewController.definitionMsg = "definition 1" 
       } else if definition == "Binary System" { 
        destinationViewController.titleMsg = "Binary System" 
        destinationViewController.definitionMsg = "definition 2" 
       } else if definition == "Computer" { 
        destinationViewController.titleMsg = "Computer" 
        destinationViewController.definitionMsg = "definition 3" 

       } else if definition == "Internet" { 
        destinationViewController.titleMsg = "Internet" 
        destinationViewController.definitionMsg = "definition 4" 

       } else if definition == "Virtual Reality" { 
        destinationViewController.titleMsg = "Virtual Reality" 
        destinationViewController.definitionMsg = "definition 5" 

       } 
      } 
     } 
    } 
} 

答えて

1

ある何か:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "ShowDefinition") { 
     if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
      if let definition = sender as? String { 
       switch definition { 
       case "Abstraction": 
        destinationViewController.titleMsg = "Abstraction" 
        destinationViewController.definitionMsg = "definition 1" 
       case "Binary System": 
        destinationViewController.titleMsg = "Binary System" 
        destinationViewController.definitionMsg = "definition 2" 
       case "Computer": 
        destinationViewController.titleMsg = "Computer" 
        destinationViewController.definitionMsg = "definition 3" 
       case "Internet": 
        destinationViewController.titleMsg = "Internet" 
        destinationViewController.definitionMsg = "definition 4" 
        destinationViewController.titleMsg = "Abstraction" 
        destinationViewController.definitionMsg = "definition 1" 
       case "Virtual Reality": 
        destinationViewController.titleMsg = "Virtual Reality" 
        destinationViewController.definitionMsg = "definition 5" 
       default: 
        destinationViewController.titleMsg = "" 
        destinationViewController.definitionMsg = "" 
       } 
      } 
     } 
    } 
} 

あなたがcaseマッチのどれもあればヒットしますdefault値、で何をしたいのか確認してください。

+0

ありがとうございます! –

0

使用このコード

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "ShowDefinition") { 
     if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
      if let definition = sender as? String { 
       switch definition { 
       case "Abstraction": 
        destinationViewController.titleMsg = "Abstraction" 
        destinationViewController.definitionMsg = "definition 1" 
       case "Binary System": 
        destinationViewController.titleMsg = "Binary System" 
        destinationViewController.definitionMsg = "definition 2" 
       case "Computer": 
        destinationViewController.titleMsg = "Computer" 
        destinationViewController.definitionMsg = "definition 3" 
       case "Internet": 
        destinationViewController.titleMsg = "Internet" 
        destinationViewController.definitionMsg = "definition 4" 
       case "Virtual Reality": 
        destinationViewController.titleMsg = "Virtual Reality" 
        destinationViewController.definitionMsg = "definition 5" 
       default: 
        // As per your requirement 
        break 
       } 
      } 
     } 
    } 
} 
1

​​は常にdefinition文字列が含まれていますので、あなたはコードがまだ短くすることができます

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowDefinition" { 
    if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
     if let definition = sender as? String { 
     switch definition { 
     case "Abstraction": 
      destinationViewController.definitionMsg = "definition 1" 
     case "Binary System": 
      destinationViewController.definitionMsg = "definition 2" 
     case "Computer": 
      destinationViewController.definitionMsg = "definition 3" 
     case "Internet": 
      destinationViewController.definitionMsg = "definition 4" 
     case "Virtual Reality": 
      destinationViewController.definitionMsg = "definition 5" 
     default : 
      destinationViewController.definitionMsg = "n/a" 

     } 
     destinationViewController.titleMsg = definition 
     } 
    } 
    } 
} 

あなたはさらに一歩進み、例列挙型を宣言することができ

enum Definitions : String { 
    case Abstraction, BinarySystem = "Binary System", Computer, Internet, VirtualReality = "Virtual Reality" 
} 

これにより、defaultこの訴訟は網羅的なものであるためです。この特定のユースケースで

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "ShowDefinition") { 
    if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
     if let definition = sender as? String, let definitionEnum = Definitions(rawValue:definition) { 
     switch definitionEnum { 
     case .Abstraction: 
      destinationViewController.definitionMsg = "definition 1" 
     case .BinarySystem: 
      destinationViewController.definitionMsg = "definition 2" 
     case .Computer: 
      destinationViewController.definitionMsg = "definition 3" 
     case .Internet: 
      destinationViewController.definitionMsg = "definition 4" 
     case .VirtualReality: 
      destinationViewController.definitionMsg = "definition 5" 
     } 
     destinationViewController.titleMsg = definition 
     } 
    } 
    } 
} 
0

、テストのみ試験に関連した実際所与Stringインスタンス(definition)は、Aの任意のメンバーと等しいかどうかを、シリアルif-elseまたはswitchブロックに頼る必要はありません指定されたリストStringのです。

destinationViewController.titleMsgにはdefinition(一致する場合)と同じ値が与えられているので、destinationViewController.definitionMsgは実行中の番号w.r.tです。 String年代のリストのインデックス(+1)は、あなたは、単一の任意の結合句ですべてそのロジックをキャプチャすることができます:あなたの例に

let validTitles = ["Abstraction", "Binary System", "Computer", "Internet", "Virtual Reality"] 
let definition = "Abstraction" 

if let definitionAndTitle = validTitles.enumerated().filter({$1 == definition}).first { 
    print("titleMsg=\(definitionAndTitle.1)") 
    print("definitionMsg=\(definitionAndTitle.0 + 1)") 
} 

応用(単に既存の任意の結合句を拡張する)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if (segue.identifier == "ShowDefinition") { 
     if let destinationViewController = segue.destinationViewController as? EnglishViewController { 
      // or, better, keep this list of titles as e.g. a static 
      // immutable property of your viewcontroller class, as these 
      // should already be set at compile time. 
      let validTitles = ["Abstraction", "Binary System", 
           "Computer", "Internet", "Virtual Reality"] 
      if let definition = sender as? String, let defNum = 
       validTitles.enumerated().filter({$1 == definition}).first?.0 { 
       destinationViewController.titleMsg = definition 
       destinationViewController.definitionMsg = "definition \(defNum+1)" 
      } 
     } 
    } 
} 
関連する問題