如何在 Swift 中的不安全指针上调用变异方法?
How to invoke a mutating method on an unsafe pointer in Swift?
有了一个带有变异方法的结构,我可以将一个结构的实例作为 inout 参数传递并调用该方法。传递的实例将被修改,如下例所示。
struct S{
var i = 0
mutating func incI(){ i += 1}
}
func f(s: inout S){
s.incI()
}
var s = S()
print(s) // prints S(i: 0)
f(s: &s)
print(s) // prints S(i: 1)
与 C API 交互时,通常只会得到一个不安全的指针。我的问题是,如何在指针对象上调用变异函数,从而修改原始实例。
fun f(p: UnsafeMutableRawPointer){
var s = p.assumingMemoryBound(to: S.self).pointee // could also use p.load(as: S.self) with same effect
s.incI()
print(s) // prints S(i: 1)
}
s = S()
print(s) // prints S(i: 0)
f(p: &s)
print(s) // prints S(i: 0) but want it to print S(i: 1)
该示例表明以某种方式创建了实例的副本。这种行为不仅出乎意料,而且让我对如何改变支持指针的内存毫无目标。
问题不在于你如何调用函数,那部分是正确的。
但是您的函数 f
(显然是为了模拟 C 函数的行为)改变了本地副本。如果将函数更改为
func f(p: UnsafeMutableRawPointer){
let sPtr = p.assumingMemoryBound(to: S.self)
sPtr.pointee.incI()
}
然后一切都按预期运行:
var s = S()
print(s) // prints S(i: 0)
f(p: &s)
print(s) // prints S(i: 1)
有了一个带有变异方法的结构,我可以将一个结构的实例作为 inout 参数传递并调用该方法。传递的实例将被修改,如下例所示。
struct S{
var i = 0
mutating func incI(){ i += 1}
}
func f(s: inout S){
s.incI()
}
var s = S()
print(s) // prints S(i: 0)
f(s: &s)
print(s) // prints S(i: 1)
与 C API 交互时,通常只会得到一个不安全的指针。我的问题是,如何在指针对象上调用变异函数,从而修改原始实例。
fun f(p: UnsafeMutableRawPointer){
var s = p.assumingMemoryBound(to: S.self).pointee // could also use p.load(as: S.self) with same effect
s.incI()
print(s) // prints S(i: 1)
}
s = S()
print(s) // prints S(i: 0)
f(p: &s)
print(s) // prints S(i: 0) but want it to print S(i: 1)
该示例表明以某种方式创建了实例的副本。这种行为不仅出乎意料,而且让我对如何改变支持指针的内存毫无目标。
问题不在于你如何调用函数,那部分是正确的。
但是您的函数 f
(显然是为了模拟 C 函数的行为)改变了本地副本。如果将函数更改为
func f(p: UnsafeMutableRawPointer){
let sPtr = p.assumingMemoryBound(to: S.self)
sPtr.pointee.incI()
}
然后一切都按预期运行:
var s = S()
print(s) // prints S(i: 0)
f(p: &s)
print(s) // prints S(i: 1)