ios - Swift 如何获取对象的 "pass by value"

标签 ios swift

我是 Swift 的新手。我创建了一个类(例如):

class Fraction{
    var a: Int
    init(a:Int){
        self.a = a
    } 
    func toString() -> String{
        return "\(self.a)"
    }
}

我还在其他类函数中构建了一个:

class func A_plusplus(f:Fraction){
    f.a++
}

然后在执行类中我写:

var object = Fraction(a:10)
print("before run func = " + object.toString())
XXXclass.A_plusplus(object)
print("after ran func =" + object.toString() )

所以控制台输出是

before run func = 10; after ran func =11

问题是我怎样才能发送“对象”的副本以保持它的值等于 10

如果函数总是按引用传递,为什么我们还需要关键字:"inout"

A_plusplus(&object)//[if I make the parameter to be a inout parameter]A_plusplus(object)

有什么区别

Universally, I don't want to use struct. Although this will solve my problem exactly, I do pass-by-value rarely.So I don't want program's copying processes slow my user's phone down :(

And It seems conforming the NSCopying protocol is a good option.But I don't know how to implement the function: func copyWithZone(zone: NSZone)-> AnyObject? correctly

最佳答案

如果你的类是 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类,就得创建一个copy方法

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中主要有两种类型

  1. 引用类型。比如类实例,函数类型
  2. 值类型,如结构等(不是类实例或函数类型)

如果你传入一个引用类型,你传入的是引用的副本,它仍然指向原始对象。

如果你传入一个Copy类型,你传入的是值的副本,所以它与原始值无关

说说inout,如果你用它,它会传入相同的对象或值。它对值类型有影响

func add(inout input:Int){
    input++
}

var a = 10
print(a)//10
add(&a)
print(a)//11

关于ios - Swift 如何获取对象的 "pass by value",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33164532/

相关文章:

ios - 如何显示用户定义的位置

ios - 用户与文本字段交互的最佳方式 swift 4

ios - 嵌入 tableviewHeader 中的弹性 collectionView

swift - ARKit 对象不是从保存的文件创建的

ios - 如何更改 MPNowPlayingInfoCenter 信息以用于 youtube 播放?

ios - 如何传递数据以嵌入 ViewController?

ios - 当 UIImageView 接近 UIScrollView 的边缘时淡出

ios - 滚动并按搜索栏上的取消时应用程序崩溃

ios - CoreBluetooth 和 BluetoothManager,设备不是 BLE

json - 如何在嵌套对象 SWIFT 中获取值