[英]Objective-C pointer and swift
我正在關注一個Apple文檔 ,但是不幸的是,這些示例是用Objective-C編寫的,但是我對Swift語言充滿信心,無法理解某些東西的含義,尤其是在此示例中:
void RunLoopSourcesPerformRoutine (void *info){
RunLoopSource* obj = (RunLoopSource*)info;
[obj sourceFired];
}
這行: RunLoopSource* obj = (RunLoopSource*)info;
參數: void *info
表示info
是指向void的指針,然后我可以放置任何類型的數據結構的地址,在各種蘋果文檔之后,我看到了將void *info
轉換為快速語言的過程:
info: UnsafeMutableRawPointer?
現在, RunLoopSource* obj = (RunLoopSource*)info;
這行代碼表明obj是類型為RunLoopSource的變量,並且為其分配了(RunLoopSource *) info
的值,但是該語句的確切含義是什么? : (RunLoopSource *) info
,以及它如何以快速的語言進行翻譯?
斯威夫特真的很討厭指針。 這兩行代碼可以轉換為Swift
func RunLoopSourcesPerformRoutine(info: UnsafeMutableRawPointer) {
let obj = info.assumingMemoryBound(to: RunLoopSource.self)
obj.pointee.sourceFired()
}
這個特定的表達式是一個“類型轉換”:就是說,程序員實際上已經知道info
是聲明為任何未知對象的指針( void *
),它是指向RunLoopSource
的指針。 這會強制更改表達式的類型,以使編譯器在分配給obj
感到滿意。
相當於使用as!
在Swift中,當您知道 void *
的語義但語法無法捕獲它時,這是慣用的。
(這試圖回答您所陳述的問題,但我不確定您是否在尋找更多信息。如果是這樣,請澄清一下,我或我或其他更擅長Swift中不安全指針的專家可以提供幫助。)
您正在處理( void *info
)的是C 到void的指針 ,它以UnsafeRawPointer的形式進入Swift。 這意味着類型信息已被丟棄,並且內存正在其他位置進行管理。
為了像您認為的那樣使用此東西,即RunLoopSource,您需要將其明確表征為RunLoopSource。 在C語言中,您將像在示例代碼中那樣進行(RunLoopSource*)info
: (RunLoopSource*)info
。 在Swift中,您重新綁定 。
請注意,在您的情況下,由於此UnsafeMutableRawPointer被包裝在Optional中而使整個事情變得有些復雜,因此您必須先對其進行包裝,然后才能進行任何操作。
假設您認為該info
確實是UnsafeMutableRawPointer?
綁定到RunLoopSource,您可以說:
let rlsptr = info!.assumingMemoryBound(to: RunLoopSource.self)
let rls = rlsptr.pointee
現在rls
是一個RunLoopSource,您可以隨意使用它。 但是請記住,該內存是不受管理的,因此您只應在此刻使用它。
編輯順便說一下,Apple在這件事上有一個非常不錯的文檔: https : //swift.org/migration-guide/se-0107-migrate.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.