将引用传递给实例变量?

时间:2018-07-16 04:22:25

标签: ios swift parameter-passing pass-by-reference

我想要一个为实例变量设置值的方法,但是我想告诉它每次调用函数时哪个变量设置值。

var first: Key!
var second: Key!

func setKey(for selectedKey: Key) {
    let key = // key selected from picker 
    selectedKey = key
}

func someWhereElse() {
    setKey(for: first)
    setKey(for: second)
}

键是一个类,因此它是一种引用类型。我对参考力学的理解正确吗,还是我想要参考参考? (某种C型指针)

3 个答案:

答案 0 :(得分:1)

一种解决方案是在Key类中创建变量标识符。

设置

first.identifier = 1
second.identifier = 2

setKey方法中检查此值以标识实例变量

第二个解决方案是setKey方法,请检查引用

if first === selectedKey {
   // First Instance

} else if second === selectedKey {
   // Second Instance

} else {
   print("the two instances are not identical!")
}

答案 1 :(得分:1)

如果包含实例变量的类不是子类,则可以使其继承NSObject,使其包含setValue(_ value: Any?, forKey: String)方法。然后,您可以使用字符串作为键来设置所述类的实例的实例变量的值。

关于您对参考力学的理解,您正确地将firstsecond通过参考传递。但是,如果更改selectedKey的值,则没有更改firstsecond的值,而是在更改引用。 selectedKey保存引用,因此要更改其引用的对象的值,必须更改其属性,例如selectedKey.value = key。更改selectedKey本身的值会更改引用,因此它所引用的对象不会更改。

答案 2 :(得分:1)

应该是

func setKey(for reference: inout Key!) {
   let key = // key value you want to set
   reference = key
}  

然后您可以按以下方式调用方法,

setKey(for: &yourKeyValue)

如果要将引用指向类对象的实例成员

setKey(for: &(yourObject.yourVariable) )

根据您的代码,它将是

var first: Key!
var second: Key!

func setKey(for selectedKey: inout Key!) {
    let key = // key selected from picker 
    selectedKey = key
} 

func someWhereElse() {
    setKey(for: &first)
    setKey(for: &second)
}

请注意参数中的inout属性。这非常类似于C中的指针。
在您的情况下,类就像已经指向某种内存块(* Key)。 因此,您需要的是指向指针(** Key)的指针。 可以使用inout KeyUnsafeMutablePointer<Key>来完成。由于Swift不鼓励使用指针,因此inout Key应该用于安全性。

请注意,如果要指向Key!,则应为inout Key!
如果是Key,则应为inout Key
KeyKey!不同。

如果您想使用Unsafe Swift,下面是代码

func setKey(for reference: UnsafeMutablePointer<Key!>) {
   let key = // key value you want to set
   reference.pointee = key
}

然后您可以使用与inout相同的方式来调用它,

setKey(for: &yourValue)