2016-04-05 17 views
1

私はSwiftのEnumを理解しようとしています。列挙型のケースに関連する値を割り当て、計算された値を返すようにしたい。現在、計算された数値を返すメソッドを使用しています。Enum関連付けられた値

次のように短い行うことができれば、私は思っていた
enum Calculation { 
    case Number1(number: Int) 
    case Number2(number: Int) 

    func calculation() -> Int { 
     switch self { 
     case Number1(let number): return number + 1 
     case Number2(let number): return number + 2 
     } 
    } 
} 

:質問はあなたが計算された変数を使用するかどうかである

// This obviously doesn't work. Just an example as what I'm trying to achieve 
enum Calculation: Int { 
    case Number1(number: Int): return number + 1 
    case Number2(number: Int): return number + 2 
} 
+1

この答えはあなたを助けるかもしれません。 http://stackoverflow.com/a/32530320/3222419 –

+1

[Swift:クロージャを使用する列挙型]の複製がありますか?(http://stackoverflow.com/questions/31450971/swift-enums-that-use-closures) – bufh

+0

''私はそれがもっと短くできるかどうか疑問に思っていた:例 "あなたが試してみて、あなたの例がうまくいかないことを知りましたか?どんな研究努力もしましたか?あなたの構文は本当に私にとって意味をなさない... – nhgrif

答えて

2

enum Calculation { 
    case Number1(number: Int) 
    case Number2(number: Int) 

    var value:Int { 
     switch self { 
     case Number1(let number): return number + 1 
     case Number2(let number): return number + 2 
     } 
    } 

} 

または値として保存されてい関連する値:

enum CalculationType { 
    case Number1, Number2 
} 
enum Calculation { 

    case Number1(number: Int) 
    case Number2(number: Int) 

    init (type:CalculationType, number:Int) { 
     switch type { 
     case .Number1: 
      self = Calculation.Number1(number: number + 1) 
     case .Number2: 
      self = Calculation.Number2(number: number + 2) 
     } 

    } 
} 

あなたの質問は前者を指していますが、後者を期待しているのか、初期化が値を返すことを期待しているのかは、2番目のコードからはわかりません(initは値を返しません)。最も近いものは、静的な機能を持っているだろう:

enum CalculationType { 
    case Number1, Number2 
} 
enum Calculation { 
    case Number1(number: Int) 
    case Number2(number: Int) 

    static func calc(type:CalculationType, number:Int) -> (Calculation, Int) { 
     switch type { 
     case .Number1: 
      return (Calculation.Number1(number: number), number + 1) 
     case .Number2: 
      return (Calculation.Number2(number: number), number + 2) 
     } 
    } 

} 

Calculation.calc(.Number1, number: 2) 

別の方法としては、initにコールバックを使用することもできます。

enum CalculationType { 
    case Number1, Number2 
} 
enum Calculation { 

    case Number1(number: Int) 
    case Number2(number: Int) 

    init (type:CalculationType, number:Int, callback:(Int) -> Void) { 
     switch type { 
     case .Number1: 
      self = Calculation.Number1(number: number) 
      callback(number + 1) 
     case .Number2: 
      self = Calculation.Number2(number: number) 
      callback(number + 2) 
     } 

    } 

} 


Calculation(type: .Number1, number: 10, callback: {n in print(n)}) 
関連する問題