ma1*_*w28 118 arrays pass-by-reference swift
我想我的雨燕传递Array
account.chats
到chatsViewController.chats
引用(这样当我加入聊天account.chats
,chatsViewController.chats
仍然指向account.chats
).即,我不希望Swift在account.chats
更改长度时将两个数组分开.
小智 133
对于函数参数运算符,我们使用:
let(它的默认运算符,所以我们可以省略let)使参数变为常量(这意味着我们甚至不能修改本地副本);
var使其变量(我们可以在本地修改它,但它不会影响已传递给函数的外部变量); 并且
inout使它成为in-out参数.In-out实际上意味着通过引用而不是通过值传递变量.它不仅要求通过引用接受值,还要通过引用传递它,所以将它传递给& - 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]
Run Code Online (Sandbox Code Playgroud)
确切地说,它不仅仅是一个引用,而是外部变量的真正别名,因此您可以使用任何变量类型执行此类技巧,例如使用整数(您可以为其指定新值),尽管它可能不是良好的做法,修改像这样的原始数据类型可能会令人困惑.
Kaa*_*glu 66
Swift中的结构是按值传递的,但您可以使用inout
修饰符来修改数组(请参阅下面的答案).类通过引用传递.Array
并Dictionary
在Swift中实现为结构.
GoZ*_*ner 22
定义自己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 }
}
}
Run Code Online (Sandbox Code Playgroud)
使用BoxedArray
您使用的任何地方Array
.BoxedArray
通过引用分配a 将是一个类,因此通过Array
接口对存储属性的更改将对所有引用可见.
小智 18
对于Swift版本3-4(XCode 8-9),请使用
var arr = [1, 2, 3]
func addItem(_ localArr: inout [Int]) {
localArr.append(4)
}
addItem(&arr)
print(arr)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
71761 次 |
最近记录: |