2015-07-18 18 views
8

Sto leggendo il documento di Swift tour e sto affrontando un problema. ecco il codice:Posso modificare i valori associati di un enum?

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

La funzione adjust() non funziona, mi chiedo se c'è un modo per cambiare il valore associato di un enum, e come?

risposta

18

Il problema più immediato è che si sta tentando di modificare il valore di una variabile immutabile (dichiarata con let) quando si deve dichiararla con var. Questo non risolverà questo particolare problema anche se la tua variabile name contiene una copia del valore associato, ma in generale questo è qualcosa che devi essere a conoscenza.

Se si desidera risolvere questo, è necessario dichiarare la funzione adjust() come funzione di muting e riassegnare il sé caso per caso per essere un nuovo valore enum con un valore associato composto da quello vecchio e quello nuovo . Ad esempio:

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