首先,如果您傳遞一個結構體,它通常會按值傳遞。即使該結構的所有屬性被複制僅指針性質,這是引用類型等的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