2015-07-18 20 views
8

Czytam dokument trasy Swift i stoję przed problemem. Oto kod:Czy mogę zmienić skojarzone wartości wyliczenia?

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

Funkcja adjust() nie będzie działać, zastanawiam się, czy istnieje sposób, aby zmienić wartości związanej z wyliczenia i jak?

Odpowiedz

18

Najprostszym problemem jest próba zmiany wartości zmiennej niezmiennej (zadeklarowanej przy użyciu let), gdy powinieneś zadeklarować ją pod numerem var. Nie rozwiąże to jednak konkretnego problemu, ponieważ twoja zmienna name zawiera kopię skojarzonej wartości, ale ogólnie jest to coś, o czym musisz wiedzieć.

Jeśli chcesz rozwiązać ten problem, musisz zadeklarować funkcję adjust() jako funkcję mutowania i zmienić przypisanie siebie na podstawie poszczególnych przypadków, aby była to nowa wartość wyliczeniowa z powiązaną wartością złożoną ze starego i nowego . Na przykład:

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) 
} 
Powiązane problemy