2016-04-05 11 views
1

Swift'in Enum'unu anlamaya çalışıyorum. Enum durumumu ilişkili bir değer olarak atamak ve hesaplanan bir değere sahip olmak istiyorum. Şu anda hesaplanan sayıyı döndürmek için bir yöntem kullanıyorum. o gibi kısa yapılabilir eğerEnum ilişkili değerleri

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 
     } 
    } 
} 

merak ediyorum:

soru hesaplanan bir değişken kullanmak isteyip istemediğinizi olan
// 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

yakın şey statik bir işleve sahip olacaktır. http://stackoverflow.com/a/32530320/3222419 –

+1

Olası çoğaltması [Swift: Ençiler kullanılan Enums?] (http://stackoverflow.com/questions/31450971/swift-enums-that-use-closures) – bufh

+0

"" Daha kısa yapılabilir mi diye merak ediyordum: Örnek "' Çalışmaya çalışmadığınızı ve bulmaya çalışmaktan sıkıldınız mı? Herhangi bir araştırma çabası mı yaptın? Sözdiziminiz bana anlam ifade etmiyor bile ... – nhgrif

cevap

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 
     } 
    } 

} 

Veya olarak depolanan değere sahip ilişkili değer:

Sorunuz, birinciye doğru yöneliyor, fakat ikinci kod parçanızdan, ikincisini beklediğinizi ya da başlatma işleminin bir değer döndüreceğini umduğumdan emin değilim (bir init bir değer döndürmüyor).

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) 

Alternatif init bir geri arama kullanabilirsiniz: Bu cevap size yardımcı olabilecek

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)})