Prima di tutto, se si passa una struttura viene normalmente passata per valore. Anche se tutte le proprietà del struct vengono copiati solo il puntatore di proprietà che sono tipi di riferimento simili UIImage ottiene duplicati (solo 8 byte):
var data1 = MyData()
var data2 = data1
// both data1 and data2 point to the same image
Anche il compilatore di ottimizzare il codice in modo struct ottenere internamente passati per riferimento e copiati se necessario.
Come esempio di passare una struttura per riferimento nel codice di livello superiore è possibile utilizzare inout
parametri: Quindi un parametro inout
può essere passato per riferimento, ma genericamente di Swift di attuare inout
è che il parametro si passa per valore e dopo la funzione restituisce viene riassegnata.
Sebbene il compilatore ottimizzi la chiamata di funzione in modo da poter ottenere un riferimento reale in alcune situazioni. Questa ottimizzazione riguarda solo le variabili che non sono calcolate o hanno un osservatore delle proprietà come willSet
e didSet
(e probabilmente altri casi).
Così si dovrebbe fare affidamento solo sulla istanza corrente che non è nel campo di applicazione della funzione:
struct Test {
var value = 0
}
// case 1
var myTest = Test()
// case 2
var myTest = Test() {
didSet { print("I was set") }
}
// case 3
var myTest: Test {
get{ return Test() }
set{ print("I set myself") }
}
func mutateTest(inout t: Test) {
// directly referencing to myTest
myTest.value // value = 0 in all cases
t.value = 42
myTest.value // value = 42 in case 1 ; value = 0 in case 2 and 3
t = Test() // nothing gets printed
myTest.value // value = 0 in all cases
t = Test() // nothing gets printed
t.value = 3 // value = 3 in case 1 ; value = 0 in case 2 and 3
}
changeTest(&myTest)
//case 2: "I was set", case 3 "I set myself" get printed now
myTest.value // value = 3 in all cases
Come si può vedere myTest
e t
sono equivalenti solo in caso 1 ("veri" semantica di riferimento) . Quindi questo fa una grande differenza se si fa riferimento anche a myTest
nella funzione stessa. Ma finché non lo fai, sei a posto.
Per fortuna l'immagine è un tipo di riferimento e si dovrà sostenere lo stesso costo copiando la struttura in base al valore come si farebbe passando il riferimento a UIImage. –
questa sarebbe una buona risposta con una fonte – Esqarrouth