gpt4 book ai didi

Swift 3 - 通过 UnsafeMutableRawPointer 通过引用传递结构?

转载 作者:可可西里 更新时间:2023-11-01 01:23:31 27 4
gpt4 key购买 nike

Core Audio 框架中,用户数据可以通过 UnsafeMutableRawPointer? 传递到回调中。我想知道如何通过此 UnsafeMutableRawPointer? 传递结构通过引用。回调内所做的更改应反射(reflect)在回调外。

我建立了一个 Playground 来测试这个:

struct TestStruct {
var prop1: UInt32
var prop2: Float64
var prop3: Bool
}

func printTestStruct(prefix: String, data: TestStruct) {
print("\(prefix): prop1: \(data.prop1), prop2: \(data.prop2), prop3: \(data.prop3)")
}

func testUnsafeMutablePointer(data: UnsafeMutableRawPointer?) {
var testStructInFunc = data!.load(as: TestStruct.self)

printTestStruct(prefix: "In func (pre change)", data: testStructInFunc)

testStructInFunc.prop1 = 24
testStructInFunc.prop2 = 1.2
testStructInFunc.prop3 = false

printTestStruct(prefix: "In func (post change)", data: testStructInFunc)
}

var testStruct: TestStruct = TestStruct(prop1: 12, prop2: 2.4, prop3: true)

printTestStruct(prefix: "Before call", data: testStruct)

testUnsafeMutablePointer(data: &testStruct)

printTestStruct(prefix: "After call", data: testStruct)

遗憾的是,在函数调用之后,在 testUnsafeMutablePointer 函数中对 testStruct 所做的任何更改似乎都丢失了。

我在想,UnsafeMutableRawPointer 在这里的行为类似于引用传递?我错过了什么?

最佳答案

您的函数将数据复制到本地结构中,但不将修改后的数据复制回来。所以这将是一个可能您的特殊情况下的解决方案:

func testUnsafeMutablePointer(data: UnsafeMutableRawPointer?) {
var testStructInFunc = data!.load(as: TestStruct.self)

testStructInFunc.prop1 = 24
testStructInFunc.prop2 = 1.2
testStructInFunc.prop3 = false

data!.storeBytes(of: testStructInFunc, as: TestStruct.self)
}

但请注意,这仅在结构仅包含“简单”时才有效值喜欢整数和浮点值。 “复杂”类型像数组或字符串包含指向实际存储的不透明指针不能像这样简单地复制。

另一种选择是像这样修改指向的结构:

func testUnsafeMutablePointer(data: UnsafeMutableRawPointer?) {
let testStructPtr = data!.assumingMemoryBound(to: TestStruct.self)

testStructPtr.pointee.prop1 = 24
testStructPtr.pointee.prop2 = 1.2
testStructPtr.pointee.prop3 = false
}

两种解决方案都假设回调时该结构仍然存在被调用,因为传递一个指针并不能确保指向结构的生命周期。

作为替代方案,请考虑使用 class 的实例。将保留或未保留的指针传递给实例允许控制回调处于“事件”状态时对象的生命周期,比较 How to cast self to UnsafeMutablePointer<Void> type in swift .

关于Swift 3 - 通过 UnsafeMutableRawPointer 通过引用传递结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42596246/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com