【问题标题】:How to invoke a mutating method on an unsafe pointer in Swift?如何在 Swift 中调用不安全指针上的变异方法?
【发布时间】:2020-03-30 06:18:14
【问题描述】:

拥有一个带有变异方法的结构,我可以将一个结构的实例作为 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)

该示例表明以某种方式制作了实例的副本。这种行为不仅出乎意料,而且让我对如何改变支持指针的内存毫无目标。

【问题讨论】:

    标签: swift unsafe-pointers


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2013-09-17
      • 2016-11-14
      • 1970-01-01
      相关资源
      最近更新 更多