首先,如果您传递一个结构体,它通常会按值传递。即使该结构的所有属性被复制仅指针性质,这是引用类型等的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