2014-06-12 14 views
5

Ho un metodo che i risultati struct stesso utilizzando return selfRientro versione mutevole struct a Swift

Purtroppo io sono sempre il valore Immutabile di tipo "nome Struct" ha solo mutabile nome del membro errore 'nome di metodo'.

Come posso restituire tale che la struttura sia modificabile?

+1

mostrano il codice e il messaggio di errore completo (indicano anche che la linea) –

+0

Editing domanda e l'aggiunta di codice –

risposta

8

È possibile modificare le strutture in modo corretto, ma è necessario annotare i metodi di modifica con mutating.

struct SomeStruct { 
    var x:Int = 0 
    mutating func increment() { 
     x++; 
    } 
} 

Edit:

Permettetemi di fare alcune precisazioni qui. Le strutture possono essere mutati:

var structA = SomeStruct() 
structA.x // 0 
structA.increment() 
structA.x // 1 

Ma solo se dichiarati come var. Questo non verrà compilato:

let structA = SomeStruct() 
// structA.increment() // Compile error 

Ora, quando si fa qualcosa di simile something.methodReturningStruct().mutatingMethod(), il methodReturningStruct() sarà effettivamente restituire una copia della struct originale (in virtù dei tipi di valore). Ma dal momento che non l'hai assegnato a var, verrà trattato implicitamente come costante (ad esempio let) in modo da ottenere l'errore del compilatore.

È ancora possibile fare la stessa cosa, ma basta dire rapido per utilizzare lo struct come var

var structB = something.methodReturningStruct() 
structB.mutatingMethod() 
+1

Non è possibile mutarli direttamente dal ritorno di un altro metodo. 'structA.methodReturningSelf(). mutatingMethod()' – drewag

+1

Questo perché lo hai incatenato. Il compilatore vede che 'methodReturningSelf()' restituisce una copia della 'structA' originale, ma tu hai chiamato un metodo direttamente su di esso senza assegnarlo (rendendo inutilizzabile la nuova copia, così come la chiamata al' mutatingMethod() 'inutile Funzionerà bene: 'var structB = structA.methodReturningSelf(); structB.mutatingMethod()'. Nota l'uso 'var' invece di' let'. –

+0

L'intero punto della domanda è essere in grado di concatenarli – drewag