你所試圖做的是極不安全的,因爲你自己也說了,有可能更安全的方法來解決任何問題您正在使用的,但在這裏是做一個完整的例子:
func getPointer<T:AnyObject>(obj : T) -> Int64
{
return unsafeBitCast(unsafeAddressOf(obj), Int64.self)
}
func recoverObject<T:AnyObject>(ptr : Int64) -> T
{
return Unmanaged<T>.fromOpaque(COpaquePointer(bitPattern: Int(ptr))).takeUnretainedValue()
}
class C {
var cID = 0
func foo() {
print("Instance of C, id = \(cID)")
}
}
class D {
var dID = 0
func foo() {
print("Instance of D, id = \(dID)")
}
}
let c : C = C()
let d : D = D()
c.cID = 123;
d.dID = 321;
let cPtr : Int64 = getPointer(c)
let dPtr : Int64 = getPointer(d)
c.cID *= 10
let c1 : C = recoverObject(cPtr)
let d1 : D = recoverObject(dPtr)
c1.foo()
d1.foo()
輸出是:
Instance of C, id = 1230
Instance of D, id = 321
感謝user3441734一些有用的提示!請注意泛型的使用。獲取「指針」和取消引用它的函數應該適用於任何類(儘管如此,它們不適用於結構體)。
至於這樣做的更安全的方式,答案將取決於你在做什麼的上下文。爲什麼不能在需要實例的地方訪問實例數組,而不是通過Int64s獲取實例?如果陣列實際上由第三方庫(Objective-)C代碼保持,則有可能出現的是,由於存儲器對準等另外的問題它可能會編寫C代碼,將返回實例SWIFT代碼在更安全的方式。
請讓我知道更多的細節,如果回答不出於某種原因。
「我設法從我的Int64中正確初始化了一個UnsafePointer。」告訴我們這部分代碼,請 –
user3441734