如果你的类是 NSObject 的子类,最好使用NSCopying
class Fraction:NSObject,NSCopying{
var a:Int
var b:NSString?
required init(a:Int){
self.a = a
}
func toString() -> String{
return "\(self.a)"
}
func copyWithZone(zone: NSZone) -> AnyObject {
let theCopy=self.dynamicType.init(a: self.a)
theCopy.b = self.b?.copy() as? NSString
return theCopy
}
}
class XXXclass{
class func A_plusplus(f:Fraction){
f.a++
f.b = "after"
}
}
var object = Fraction(a:10)
object.b = "before"
print("before run func = " + object.toString())
print(object.b!) //“Before”
XXXclass.A_plusplus(object.copy() as! Fraction)
print("after ran func =" + object.toString() )
print(object.b!)//“Before”
如果只是一个普通的swift类,你必须创建一个复制方法
class Fraction{
var a: Int
init(a:Int){
self.a = a
}
func toString() -> String{
return "\(self.a)"
}
func copy()->Fraction{
return Fraction(a: self.a)
}
}
class XXXclass{
class func A_plusplus(f:Fraction){
f.a++
}
}
var object = Fraction(a:10)
print("before run func = " + object.toString())
XXXclass.A_plusplus(object.copy())
print("after ran func =" + object.toString() )
为了说清楚,你要知道swift中主要有两种类型
-
参考类型。如类实例、函数类型
-
值类型,如结构体和其他(不是类实例或函数类型)
如果你传入一个引用类型,你传入的副本参考,它仍然指向原来的对象。
如果您传入 Copy 类型,你传入的是值的副本,所以它与原始值无关
让我们谈谈inout
,如果你使用它,它会传递相同的对象或值。它会影响值类型
func add(inout input:Int){
input++
}
var a = 10
print(a)//10
add(&a)
print(a)//11