【问题标题】:Pass a reference to an instance variable?传递对实例变量的引用?
【发布时间】:2018-12-23 13:43:53
【问题描述】:

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

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)
}

Key 是一个类,所以它是一个引用类型。我对参考机制的理解正确还是我想要参考参考? (某种 C 类型的指针)

【问题讨论】:

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


    【解决方案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)
    

    【讨论】:

    【解决方案2】:

    一种解决方案是在 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!")
    }
    

    【讨论】:

      【解决方案3】:

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

      至于您对引用机制的理解,firstsecond 将通过引用传递是对的。但是,如果您更改selectedKey 的值,您并没有更改firstsecond 的值,而是更改了引用。 selectedKey 持有引用,因此要更改它引用的对象的值,您必须更改其属性,例如selectedKey.value = key。更改selectedKey 的值本身会更改引用,因此它所引用的对象不会更改。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-18
        • 2016-11-01
        • 2011-07-13
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多