Swift:通过引用传递数组?

我想通过引用传递我的Swift Array account.chatschatsViewController.chats (所以当我添加一个聊天account.chatschatsViewController.chats仍然指向account.chats )。 也就是说,我不希望Swift在account.chats的长度发生变化时将两个数组分开。

Swift中的结构体是按值传递的,但是你可以使用inout修饰符来修改你的数组(见下面的答案)。 类通过引用传递。 在Swift中的ArrayDictionary是作为结构体实现的。

对于函数参数运算符我们使用:

(它是默认的操作符,所以我们可以忽略)让参数不变(这意味着我们不能修改本地副本);

var使其variables(我们可以在本地修改它,但它不会影响传递给函数的外部variables); 和

inout使它成为一个input参数。 In-out实际上是指通过引用而不是按值来传递variables。 而且它不仅需要通过引用来接受值,还要通过引用来传递它,所以传递给foo(&myVar)而不仅仅是foo(myVar)

所以这样做:

 var arr = [1, 2, 3] func addItem(inout localArr: [Int]) { localArr.append(4) } addItem(&arr) println(arr) // it will print [1, 2, 3, 4] 

确切地说,它不仅仅是一个引用,而且是外部variables的一个真实的别名,所以你可以用任何variablestypes来做这样的诡计,例如用整数(你可以给它赋新值),虽然它可能不是一个好的做法,修改这样的原始数据types可能会令人困惑。

定义一个BoxedArray<T>来实现Array接口,但将所有的函数委托给一个存储的属性。 因此

 class BoxedArray<T> : MutableCollection, Reflectable, ... { var array : Array<T> // ... subscript (index: Int) -> T { get { return array[index] } set(newValue) { array[index] = newValue } } } 

在你使用Array任何地方使用BoxedArrayBoxedArray分配将通过引用,它是一个类,因此通过Array接口更改存储的属性将对所有引用都可见。

Swift 3 Xcode 8是

 var arr = [1, 2, 3] func addItem(_ localArr: inout [Int]) { localArr.append(4) } addItem(&arr) print(arr) 

就像是

 var a : Int[] = [] func test(inout b : Int[]) { b += [1,2,3,4,5] } test(&a) println(a) 

???

另一种select是让arrays的使用者根据需要向所有者询问。 例如,一些沿线的东西:

 class Account { var chats : [String]! var chatsViewController : ChatsViewController! func InitViewController() { chatsViewController.getChats = { return self.chats } } } class ChatsViewController { var getChats: (() -> ([String]))! func doSomethingWithChats() { let chats = getChats() // use it as needed } } 

然后,您可以在Account类中尽可能多地修改数组。 请注意,如果您还想从视图控制器类中修改数组,则这并不能帮助您。

Swift 3和Xcode 8:

 var myArray = [1, 2, 3] for (index, value) in myArray.enumerated() { // if you don't need the value you could do: for (index, _) in myArray.enumerated() myArray[index].append(4) }