Прежде всего, если вы передаете структуру, она обычно передается по значению. Даже если все свойства структуры копируются только указатель на свойства, которые являются ссылочными типами, как UIImage получает дублируется (всего 8 байт):
var data1 = MyData()
var data2 = data1
// both data1 and data2 point to the same image
Также компилятор оптимизирует код таким образом Структуры получить внутренне передаются по ссылке и скопировать если нужно.
В качестве примера пропускания-структуры по ссылке в верхнем уровне коде можно использовать inout
параметров: так что inout
параметр может быть передан по ссылке, но общий путь Свифта реализации inout
является то, что параметр получает пассы по значению и после функция возвращает его переназначение.
Хотя компилятор оптимизирует вызов функции, чтобы вы могли получить истинную ссылку в некоторых ситуациях. Эта оптимизация влияет только на переменные, которые не вычисляются или имеют наблюдателя свойств, такие как willSet
и didSet
(и, возможно, в других случаях).
Таким образом, вы должны полагаться только на текущем экземпляре, который не находится в области видимости функции:
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
Как вы можете видеть myTest
и t
эквивалентны только в случае, если 1 («истинная» эталонная семантика) , Так что это имеет огромное значение, если вы также ссылаетесь на myTest
в самой функции. Но пока вы этого не делаете, вам хорошо идти.
К счастью, ваше изображение является ссылочным типом, и вы понесете примерно такую же стоимость от копирования структуры по стоимости, как и вы, пройдя ссылку на UIImage. –
это был бы хороший ответ с источником – Esqarrouth