我有这堂课:
class MainView:UIView{
var categories:[Category]!
}
我想设置类别arg,但我需要通过引用而不是值传递它。因为它更高效,更好。
所以,如果我这样做:
let mainView = MainView()
mainView.categories = categoriesData.
然后它按值传递它。
如果我需要通过引用传递它,我可以通过使用MainView()
中的函数来实现class MainView:UIView{
var categories:[Category]!
fun setCategories(inout categories: Int){
self.categories = categories;
}
}
但如果我不想使用set函数,我怎么能通过引用传递它。 e.g
mainView.categories = &categoriesData.
但这不起作用?谢谢
答案 0 :(得分:6)
Swift在处理数组时使用ARC(自动引用计数),它会延迟复制数组,直到其中一个副本被修改:
例如:
var a = [1, 2, 3, 4, 5]
let b = a
let c = a // 1
a.append(6) // 2
print(a.count)
print(b.count)
print(c.count)
在上面的第1步中,内存中只有[1, 2, 3, 4, 5]
的一个副本,而a
,b
和c
都是对它的引用。
在步骤2中修改a
后,Swift会提供a
数组的新副本,而b
和c
会继续引用原始数组。所以现在内存中有2个数组副本。
让我们看一个更为复杂的例子:
class Person: CustomStringConvertible {
let name: String
var friends: [Person] = []
init(name: String) {
self.name = name
}
var description: String { return name }
}
func createFredsFriends() -> [Person] {
let barney = Person(name: "Barney")
let wilma = Person(name: "Wilma")
let betty = Person(name: "Betty")
let friends = [barney, wilma, betty] // 1
return friends
}
func createFred() -> Person {
let fred = Person(name: "Fred")
let friends = createFredsFriends() // 2
fred.friends = friends // 3
return fred
}
let fred = createFred() // 4
print(fred.friends) // [Barney, Wilma, Betty]
在第1步,创建好友阵列。它由局部变量friends
引用。
当createFredsFriends()
返回时,此引用消失,并且在步骤2中对本地变量friends
保持对该数组的唯一引用。已经传递了该数组的所有权。 / p>
在第3步,已为friends
的{{1}}属性分配了对该数组的第二次引用。
在步骤4,fred
已返回,因此局部变量createFred()
消失,不再引用该数组。唯一的引用是friends
对象的属性,该对象由变量fred
保存。
因此,数组创建一次,创建了几个引用,最后只有一个对数组的引用,所有这些都是在没有单个复制操作的情况下完成的。
由于Swift数组是值类型并在更改时复制,因此您无法传递数组,而是希望在复制时更新原始数据。如果您需要该级别的功能,则可以为该数组创建一个类包装器,然后始终通过该类的实例访问该数组。
在这里,我修改了上一个示例,以说明它是如何工作的:
fred