gpt4 book ai didi

ios - 如何在没有函数的情况下通过引用传递数组? swift

转载 作者:搜寻专家 更新时间:2023-10-31 22:06:51 25 4
gpt4 key购买 nike

我有这门课:

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 函数,我怎么能通过引用传递它。例如

mainView.categories = &categoriesData. 但这不起作用?谢谢

最佳答案

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 是对它的引用。

a 在第 2 步被修改时,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 步中,创建了 friend 数组。它由局部变量 friends 引用。

  • createFredsFriends() 返回时,该引用消失,然后在第 2 步中,对数组的唯一引用由局部变量 friends 保存。所有权已经传递了数组。

  • 在第 3 步,对数组的第二个引用已分配给 fredfriends 属性。

  • 在第 4 步,createFred() 已返回,因此局部变量 friends 已消失,不再引用数组。唯一的引用是 fred 对象的属性,该对象由变量 fred 保存。

所以数组只创建了一次,创建了多个对它的引用,最后只有一个对数组的引用,所有这一切都是在没有一个复制操作的情况下完成的。


由于 Swift 数组是值类型并在更改时进行复制,因此您不能传递一个数组,然后期望在复制时更新原始数组。如果您需要该级别的功能,您可以为数组创建一个类包装器,然后始终通过该类的实例访问该数组。

这里我修改了前面的例子来展示它是如何工作的:

// Class to wrap array so that everyone references the same copy
class FriendsWrapper {
var friends: [Person]

init(friends: [Person]) {
self.friends = friends
}
}

class Person: CustomStringConvertible {
let name: String
var friendsWrapper: FriendsWrapper?

init(name: String) {
self.name = name
}

func addFriend(friend: Person) {
if let wrapper = friendsWrapper {
wrapper.friends.append(friend)
} else {
friendsWrapper = FriendsWrapper(friends: [friend])
}
}

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]

return friends
}

func createFred() -> Person {
let fred = Person(name: "Fred")

let friendsWrapper = FriendsWrapper(friends: createFredsFriends())
fred.friendsWrapper = friendsWrapper

// Add friend to Fred object
fred.addFriend(Person(name: "Bam Bam"))

// Copy of array in local friendsWrapper is updated
print(friendsWrapper.friends) // [Barney, Wilma, Betty, Bam Bam]

return fred
}

let fred = createFred()

关于ios - 如何在没有函数的情况下通过引用传递数组? swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35391394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com