2015-06-25 41 views
1

我在玩弄Swift枚舉並想知道是否有方法來改變enum的assoicated值,例如下面的代碼嘗試失敗。是否可以更改枚舉中的關聯值?

enum myEnum { 
    case SomeCase(Int?) 

    mutating func someFunc() { 
     switch self { 
     case .SomeCase(let a): 
      if a != nil { 
       // a = 5 can't do this of course as assigning to let 
       var temp = a!; // but this generates a warning 
       temp = 5; 
      } 
     } 
    } 
} 

如果這不是現在可能的話,是否將變異的枚舉變爲XCode?

回答

0

Rob Napier的回答很好,但我對你的問題有不同的理解。我會寫這樣的事情,而不是:

enum MyEnum { 

    case SomeCase(Int?) 

    mutating func someFunc() { 
     switch self { 
     case .SomeCase(.Some(_)): 
      self = .SomeCase(5) 
     default: 
     // or case .SomeCase(.None): if you prefer 
      break 
     } 
    } 

} 

有了這個代碼,該enum突變與someFunc當且僅當其相關值不nil。因此,我在遊樂場測試時得到以下結果(結果顯示爲評論):

var x = MyEnum.SomeCase(nil) 

switch x { 
case .SomeCase(.Some(let a)): 
    println(a) 
default: 
    println("Associated value is nil") // Will print "Associated value is nil" 
} 

x = MyEnum.SomeCase(20) 
x.someFunc() 

switch x { 
case .SomeCase(.Some(let a)): 
    println(a) // Will print 5 
default: 
    println("Associated value is nil") 
} 
1

整個枚舉是一個單一的值,所以你必須完全替換它,而不是逐場。但你可以通過替換self來做到這一點。

enum MyEnum { 
    case SomeCase(Int?) 

    mutating func someFunc() { 
     switch self { 
     case .SomeCase(_): 
      self = .SomeCase(5) 
     } 
    } 
} 

// You have to use `var` here of course or you can't mutate it. 
var x = MyEnum.SomeCase(1) // .SomeCase(Optional(1)) 
x.someFunc() // .SomeCase(Optional(5)) 
+0

謝謝。附:我很想看到一本名爲「iOS 9 Swift編程。推動極限」的書。任何可能發生的機會? ;-) – Gruntcakes

+0

我目前正在堅持短篇寫作,主要是寫博客。 –