传递对实例变量的引用?
Pass a reference to an instance variable?
我想要一个为实例变量设置值的方法,但我想告诉它在每次调用该函数时为哪个变量设置值。
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 是一个 class 所以它是一个引用类型。我对参考机制的理解是否正确,或者我想要参考的是什么? (某种 C 类型指针)
一种解决方案是在 Key class 中创建变量标识符。
设置
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!")
}
如果包含实例变量的class不是子class,你可以让它继承NSObject
,这样它就包含了setValue(_ value: Any?, forKey: String)
方法。然后,您可以使用字符串作为键来设置所述 class 实例的实例变量的值。
至于你对引用机制的理解,你是对的 first
和 second
将通过引用传递。但是,如果更改 selectedKey
的值,则不会更改 first
或 second
的值,而是更改引用。 selectedKey
持有引用,所以要改变它引用的对象的值,你必须改变它的属性,例如selectedKey.value = key
。更改 selectedKey
的值本身会更改引用,因此它引用的对象不会更改。
应该是
func setKey(for reference: inout Key!) {
let key = // key value you want to set
reference = key
}
然后就可以调用下面的方法了,
setKey(for: &yourKeyValue)
如果你想将引用指向class对象的实例成员
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 中的指针。
在您的情况下,classes 就像已经指向某种内存块(* Key
)。
因此,您需要的是指向指针 (** Key
) 的指针。
这可以用 inout Key
或 UnsafeMutablePointer<Key>
来完成。由于 Swift 不鼓励使用指针,因此应使用 inout Key
以确保安全。
注意,如果要指向Key!
,应该是inout Key!
。
如果是Key
,应该是inout Key
.
Key
和 Key!
不一样。
如果你想使用不安全 Swift,这里是代码
func setKey(for reference: UnsafeMutablePointer<Key!>) {
let key = // key value you want to set
reference.pointee = key
}
那么就可以像inout
,
一样调用了
setKey(for: &yourValue)
我想要一个为实例变量设置值的方法,但我想告诉它在每次调用该函数时为哪个变量设置值。
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 是一个 class 所以它是一个引用类型。我对参考机制的理解是否正确,或者我想要参考的是什么? (某种 C 类型指针)
一种解决方案是在 Key class 中创建变量标识符。
设置
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!")
}
如果包含实例变量的class不是子class,你可以让它继承NSObject
,这样它就包含了setValue(_ value: Any?, forKey: String)
方法。然后,您可以使用字符串作为键来设置所述 class 实例的实例变量的值。
至于你对引用机制的理解,你是对的 first
和 second
将通过引用传递。但是,如果更改 selectedKey
的值,则不会更改 first
或 second
的值,而是更改引用。 selectedKey
持有引用,所以要改变它引用的对象的值,你必须改变它的属性,例如selectedKey.value = key
。更改 selectedKey
的值本身会更改引用,因此它引用的对象不会更改。
应该是
func setKey(for reference: inout Key!) {
let key = // key value you want to set
reference = key
}
然后就可以调用下面的方法了,
setKey(for: &yourKeyValue)
如果你想将引用指向class对象的实例成员
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 中的指针。
在您的情况下,classes 就像已经指向某种内存块(* Key
)。
因此,您需要的是指向指针 (** Key
) 的指针。
这可以用 inout Key
或 UnsafeMutablePointer<Key>
来完成。由于 Swift 不鼓励使用指针,因此应使用 inout Key
以确保安全。
注意,如果要指向Key!
,应该是inout Key!
。
如果是Key
,应该是inout Key
.
Key
和 Key!
不一样。
如果你想使用不安全 Swift,这里是代码
func setKey(for reference: UnsafeMutablePointer<Key!>) {
let key = // key value you want to set
reference.pointee = key
}
那么就可以像inout
,
setKey(for: &yourValue)