swift和java一样,看不到指针的语法,那么swift在传值时到底是复制了一份传过去还是传引用(指针)呢
先说结论 与java类似,在传基本类型时是拷贝一份副本传过去,如String, Int等,在传实例时传的则是引用(指针)。在方法中改变副本的值对原值无影响,但是在方法中改变传入实例的引用会对原实例产生影响。代码如下:
let str = "first"
let number = 0
func change(var temp:Int) -> Void {
temp = 666
}
change(number)
print("number is \(number)")
//number is 0
不论传入的是number还是str,在change()方法中对传入参数作任何操作对自身都没有影响。但是:
class MyClass {
var age = 0
}
let myClass = MyClass()
myClass.age = 10
print("myclass.age is\(myClass.age)")
// myclass.age is 10
func change(var temp:MyClass) -> Void {
temp.age = 106
temp = MyClass()
temp.age = 200
// temp = 666
}
change(myClass)
print("myclass.age is\(myClass.age)")
//myclass.age is 106
此时change()中对参数做的操作就对原先的myclass产生了影响,证明对象在传值时的类型是对象的引用。
所以可以根据这一特性灵活iOS中的KVO属性,并且在传值时需要小心,保证自己知道自己在干什么,如果不需要对原对象进行更改,可以copy一份传入