亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

UnsafePointer <UInt8>函數參數行為的字符串值

UnsafePointer <UInt8>函數參數行為的字符串值

ibeautiful 2019-10-21 15:48:55
我發現以下代碼可以編譯并運行:func foo(p:UnsafePointer<UInt8>) {    var p = p    for p; p.memory != 0; p++ {        print(String(format:"%2X", p.memory))    }}let str:String = "今日"foo(str)這將打印出來E4BB8AE697A5,并且是UTF8的有效表示形式今日據我所知,這是未記錄的行為。從文檔中:當一個函數被聲明為帶有UnsafePointer參數時,它可以接受以下任何一個:nil,作為空指針傳遞UnsafePointer,UnsafeMutablePointer或AutoreleasingUnsafeMutablePointer值,必要時將其轉換為UnsafePointer一個In-out表達式,其操作數是Type類型的左值,作為左值的地址傳遞一個[Type]值,作為指向數組開頭的指針傳遞,并在調用期間進行生命周期擴展在這種情況下,str不是他們。我想念什么嗎?添加:如果參數類型是 UnsafePointer<UInt16>func foo(p:UnsafePointer<UInt16>) {    var p = p    for p; p.memory != 0; p++ {        print(String(format:"%4X", p.memory))    }}let str:String = "今日"foo(str)//  ^ 'String' is not convertible to 'UnsafePointer<UInt16>'即使內部String表示形式為UTF16let str = "今日"var p = UnsafePointer<UInt16>(str._core._baseAddress)for p; p.memory != 0; p++ {    print(String(format:"%4X", p.memory)) // prints 4ECA65E5 which is UTF16 今日}
查看完整描述

3 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

SIL中的“ I”代表中級,對嗎?取決于在已編譯的運行時中實際實現字符串的方式(如果只是char*在幕后該怎么辦?),這可能是一個空操作。

查看完整回答
反對 回復 2019-10-21
?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

很好 根據swiftc -emit-sil輸出,它實際上是Array<UInt>從臨時創建的String.UTF8View.Generator??雌饋?em>還沒那么快…… 

查看完整回答
反對 回復 2019-10-21
  • 3 回答
  • 0 關注
  • 1142 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號