没有函数如何通过引用传递数组?迅速

时间:2016-02-14 11:49:31

标签: ios swift ios8 ios9 pass-by-reference

我有这堂课:

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.但这不起作用?谢谢

1 个答案:

答案 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]的一个副本,而abc都是对它的引用。

在步骤2中修改a后,Swift会提供a数组的新副本,而bc会继续引用原始数组。所以现在内存中有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