2015-07-02 14 views
16

Sto lavorando a un progetto rapido e ho un paio di array. In uno dei miei array, non voglio che il client sia in grado di mutarlo senza utilizzare uno dei miei metodi appositamente definiti. Io, d'altra parte, voglio che il getter sia accessibile. Le mie domande riguardano le proprietà di aggiunta e impostazione.Utilizzo di didSet e privato (set) su Swift Array

Domanda 1: Il privato (set) impedisce ai client di chiamare array.append?

Su un altro array, voglio vedere se è stato modificato.

Domanda 2: Se si assegna all'array una proprietà didSet, viene chiamato quando viene aggiunto l'array?

risposta

23

Domanda 1: Il privato (set) impedisce ai client di chiamare array.append?

Sì, sì.

Domanda 2: Se utilizzo assegnare all'array una proprietà didSet, viene chiamato quando viene aggiunto l'array?

Sì, didSet viene chiamato quando viene chiamato append().

+1

Sai se questo è documentato ovunque? – ndmeiri

+8

@ onmyway133 Non stavo chiedendo se la risposta è stata testata. Capisco che posso testarlo da solo. Stavo chiedendo se la documentazione menziona la risposta ovunque.Se viene menzionato ufficialmente, aggiungere un link a quel documento potrebbe essere utile per i futuri lettori che desiderano maggiori dettagli sul perché questo funziona. – ndmeiri

1

Le risposte alle tue domande sono facili da capire quando ti rendi conto che gli array di Swift sono effettivamente passati per valore. Dico in modo efficace perché si comportano come come se fossero copiati quando vengono passati, ma c'è un po 'di magia intelligente sotto il cofano per ottimizzare le cose ed evitare di duplicare inutilmente elementi.

Il gestore didSet viene chiamato quando cambia un valore di proprietà, che in Swift include matrici. Quindi append() in un array in Swift è in realtà analogo a un += su un numero intero: la matrice viene prima letta, quindi viene creato un nuovo array con il valore aggiunto e quindi il nuovo array viene riscritto nella proprietà. Quindi puoi vedere che chiamerà sicuramente didSet se chiami append() su una proprietà di array e, analogamente, rendendo set privato, gli utenti esterni non saranno in grado di chiamare append() in quanto non saranno in grado di scrivere il nuovo valore in l'array.

1
  1. Domanda 1 Sì, perché le chiamate di funzione mutanti cambiare il valore memorizzato, in tal modo privato (set) non impedisce le chiamate a funzioni mutazione.
  2. Domanda 2 Sì, per lo stesso motivo, gli osservatori vengono attivati.

Non c'è nulla di specifico per gli array qui, questa è una conseguenza degli array che sono le strutture e append è un membro mutante. Chiamare append è molto simile a influenzare un nuovo valore alla proprietà. Questo non è super esplicito, ma ci sono più informazioni nel documento per mutating members e stored properties che fanno il backup del fatto che il muting è gestito correttamente dalla lingua.