簡體   English   中英

當 UnicodeScalars 不工作時,如何以正確的方式從 Unicode 獲取字符?

[英]How to get character from Unicode in correct way when UnicodeScalars are not working?

過去幾天我搜索了答案,其中很多都非常舊(swift 2 和 1.2 左右)。 當從變量中獲取 unicode 代碼時,我想獲取字符。 因為由於某些未知原因,構造在 Swift 中不起作用:

print("\u{\(variable)}") // should be proposal for including this in Swift 6

人們建議使用 UnicodeScalars。 但是 Apple 必須在 Swift 5 中引入一些新的東西。我在這里找到了一些教程但是這個代碼片段

let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E

let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)) // 大 error here
let string2 = String(UnicodeScalar(value2)) // 🍎 error here

不起作用,使用 string1 和 string2 我收到錯誤“調用初始化程序時沒有完全匹配”。 因此,當作者發布時,我知道它必須在以前版本的 Swift 中工作,但最新版本不能。 引擎蓋下發生了什么變化? Apple 手冊中的字符串部分沒有透露任何內容。

我正在嘗試在 Swift 中重寫 Typescript 中的一些代碼,並且在 JS 中非常簡單,例如:

for (let i = str.length; i >= 1; i -= 2) {
        r = String.fromCharCode(parseInt("0x" + str.substring(i - 2, i))) + r;
    }

在過去的兩天里我一直在努力解決這個問題!

接受UInt16UInt32參數的UnicodeScalar初始化程序是可失敗的初始化程序(如果傳遞的參數是無效的 Unicode 標量值,則返回nil )。

public init?(_ v: UInt16)
public init?(_ v: UInt32)

在將其傳遞給String初始值設定項之前,必須解開可選項。

只有采用UInt8參數的初始化程序是不可失敗的:

public init(_ v: UInt8)

所以這編譯並產生了預期的結果:

let value0: UInt8 = 0x61
let value1: UInt16 = 0x5927
let value2: UInt32 = 0x1F34E

let string0 = String(UnicodeScalar(value0)) // a
let string1 = String(UnicodeScalar(value1)!) // 大
//                                        ^--- unwrap optional
let string2 = String(UnicodeScalar(value2)!) // 🍎
//                                        ^--- unwrap optional

當然,在您的真實代碼中,您將使用可選綁定而不是強制展開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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