簡體   English   中英

Objective-C指針和快捷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM