UnsafeMutablePointer <void>到具体对象类型</void>

时间:2015-04-07 13:27:30

标签: swift casting

如何从UnsafeMutablePointer<Void>转换为具体对象类型

我已经创建了一个KVO观察者并将自定义类作为上下文传递,就像这样

class Info : NSObject
{
}

class Foo : NSObject {
    dynamic var property = ""
}


var info = Info()

class Observing : NSObject {
    func observe1(object: NSObject) {

        object.addObserver(self, forKeyPath: "property", options: .New, context: &info)
    }

    override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {

        println("observed \(keyPath) change:'\(change)' context: \(context)")
    }
}

let o = Observing()
var object = Foo()
o.observe1(object)
object.property = "new value"

我想知道如何将上下文转换回Info类

1 个答案:

答案 0 :(得分:13)

UnsafeMutablePointer有一个初始化程序,它接受另一个类型的另一个UnsafeMutablePointer,结果是相同的指针,但是对于新类型。

所以在你的情况下:

let infoPtr = UnsafeMutablePointer<Info>(context)
let info = infoPtr.memory

请注意,尽管如此,正如文档描述的那样,&#34;基本上不安全的转换&#34;。如果你的指针是指向你转换它的类型的指针,或者你现在访问它的内存在这种情况下是无效的,你最终可能会访问无效的内存和你的程序会有点崩溃。