Ci sono due approcci che vorrei utilizzare qui. Il primo approccio consiste nel riconsiderare se ShoppingList
è un tipo di valore o un tipo di riferimento. Il fatto che abbia un identificatore mi suggerisce che è davvero un tipo di riferimento. Se due liste della spesa hanno gli stessi contenuti, dovrebbe essere considerata la stessa lista? Sospetto di no. Cosa significherebbe avere due liste che hanno lo stesso identificatore, ma contenuti diversi? Se ciò è illegale, di nuovo, questo tende a indicare che è un tipo di riferimento perché ha un'identità.
Se si tratta di un tipo di riferimento, ne fanno un final class
:
final class ShoppingList {}
classi finali preservare la semplicità di struct perché non soffrono i problemi di eredità. Ma forniscono semantica di riferimento. Con quel cambiamento, il tuo codice originale funzionerebbe.
L'altro modo per avvicinarsi a questo è più funzionale, dove tutto è un valore. In tal caso, è possibile raggiungere questo mappando le copie dei vostri liste della spesa:
shoppingLists = shoppingLists.map { list in
var newList = list
newList.groceryItems = getGroceryItemsByShoppingList(list)
return newList
}
Questo ci spinge verso un approccio più funzionale, ma rende l'identificatore imbarazzante. Quindi, se davvero volessi andare in questo modo, mi piacerebbe sbarazzarmi degli identificatori e magari persino rendere immutabili le liste della spesa. In tal caso, due liste della spesa identiche sono la stessa lista e puoi scrivere in uno stile più funzionale.
Ma ho il sospetto che il fatto di rendere ShoppingList
un tipo di riferimento sia l'approccio migliore.
fonte
2015-12-16 17:33:44
Grazie per aver postato una domanda chiara e concisa, hai rinnovato la mia fiducia negli sviluppatori. – RyanR