【发布时间】:2017-06-07 16:19:56
【问题描述】:
我想获取结构的指针,并获取或设置值。代码在这里
protocol TestProtocol {
}
struct TestStruct: TestProtocol {
var username: String?
}
class TestViewModel {
var testStruct: TestProtocol?
func test() -> UnsafeMutablePointer<TestStruct?>? {
guard let _ = self.testStruct as? TestStruct else {
return nil
}
return withUnsafeMutablePointer(to: &(self.testStruct)) { (pointer) -> UnsafeMutablePointer<TestStruct?> in
return pointer.withMemoryRebound(to: TestStruct?.self, capacity: MemoryLayout<TestStruct?>.size) { (point) -> UnsafeMutablePointer<TestStruct?> in
return point
}
}
}
}
func getvalue() {
let testViewModel = TestViewModel()
var testStruct = TestStruct()
testStruct.username = "123"
testViewModel.testStruct = testStruct
print("\(testViewModel.test()?.pointee?.username)")
// here print Optional(""), why not "123"?
}
get value 函数打印结果是错误的,但是如果 TestStruct 只有一个 Int 的 var,结果是正确的。就这样:
struct TestStruct: TestProtocol {
var number: Int?
}
func getvalue() {
let testViewModel = TestViewModel()
var testStruct = TestStruct()
testStruct. number = 123
testViewModel.testStruct = testStruct
print("\(testViewModel.test()?.pointee?.username)")
// Optional(123)
}
为什么?如何解决?
【问题讨论】:
-
这都是未定义的行为——传递给
withUnsafeMutablePointer(to:)和.withMemoryRebound(to:)的闭包中的指针参数仅在这些调用的生命周期内有效。还直接将TestProtocol?实例的内存重新解释为TestStruct?注定要失败(它可能在某些情况下似乎“工作”,例如在您使用Int的情况下 -但这实际上只是基于实现细节和仍未定义的行为)。您要在这里解决的实际问题是什么? -
@Hamish 在 TestViewModel 类中有一个 TestProtocol? 的 var testStruct,但是我将一个 TestStruct 实例 testStruct 传递给它,它是值引用,我想将它转换为 TestStruct 并将值设置为自身,而不是it 的复制值。你能明白吗?我的英语是台球
-
@Hamish 你能帮我吗?谢谢!!
-
对不起,但我仍然不明白你要解决的确切问题——如果你想要引用语义,你应该使用一个类,甚至可能是一个闭包(例如,参见 @987654321 @)。
标签: swift unsafemutablepointer