2015-07-18 28 views
8

Swift turu belgesini okuyorum ve bir sorunla karşılaşıyorum. İşte kodudur:Bir enum ile ilişkili değerleri değiştirebilir miyim?

enum SimpleEnum { 
    case big(String) 
    case small(String) 
    case same(String) 

    func adjust() { 
     switch self { 
     case let .big(name): 
      name += "not" 
     case let .small(name): 
      name += "not" 
     case let .same(name): 
      name += "not" 
     } 
    } 
} 

adjust() çalışmaz fonksiyonu, ben bir enum İlişkili değerini değiştirmek için bir yol olup olmadığını merak ve nasıl?

cevap

18

En acil sorununuz, var ile bildirilmeniz gerektiğinde, değiştirilemeyen bir değişkenin değerini (let ile bildirilmiştir) değiştirmeye çalıştığınızdır. name değişkeniniz ilişkili değerin bir kopyasını içerdiğinden, bu özellikle bu sorunu çözmeyecektir, ancak genel olarak bunun farkında olmanız gereken bir şeydir.

Bunu çözmek isterseniz, bir mutasyon işlevi olarak adjust() işlevini bildirmeniz ve duruma göre eski ve yeni olandan oluşan ilişkili bir değere sahip yeni bir enum değeri olarak kendini yeniden atamanız gerekir. . Örneğin:

enum SimpleEnum{ 
    case big(String) 
    case small(String) 
    case same(String) 

    mutating func adjust() { 
     switch self{ 
     case let .big(name): 
      self = .big(name + "not") 
     case let .small(name): 
      self = .small(name + "not") 
     case let .same(name): 
      self = .same(name + "not") 
     } 
    } 
} 

var test = SimpleEnum.big("initial") 
test.adjust() 

switch test { 
case let .big(name): 
    print(name) // prints "initialnot" 
case let .small(name): 
    print(name) 
case let .same(name): 
    print(name) 
} 
İlgili konular