Swift 3 - 通过 UnsafeMutableRawPointer 按引用传递结构?
Swift 3 - Pass struct by reference via UnsafeMutableRawPointer?
在 Core Audio
-Framework 中,用户数据可以通过 UnsafeMutableRawPointer?
传递到回调中。我想知道如何通过此 UnsafeMutableRawPointer?
通过引用 传递结构 。回调内所做的更改应反映在回调外。
我建立了一个 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)
}
但请注意,这仅在结构仅包含 "simple" 时有效
值喜欢整数和浮点值。 "Complex" 类型
像数组或字符串包含指向实际存储的不透明指针
不能像这样简单复制。
另一种选择是像这样修改指向的结构:
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
的实例。
将保留或未保留的指针传递给实例允许控制
回调为"active"时对象的生命周期,比较
.
在 Core Audio
-Framework 中,用户数据可以通过 UnsafeMutableRawPointer?
传递到回调中。我想知道如何通过此 UnsafeMutableRawPointer?
通过引用 传递结构 。回调内所做的更改应反映在回调外。
我建立了一个 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)
}
但请注意,这仅在结构仅包含 "simple" 时有效 值喜欢整数和浮点值。 "Complex" 类型 像数组或字符串包含指向实际存储的不透明指针 不能像这样简单复制。
另一种选择是像这样修改指向的结构:
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
的实例。
将保留或未保留的指针传递给实例允许控制
回调为"active"时对象的生命周期,比较