gpt4 book ai didi

ios - 扩展 UnicodeScalar : Creating an init method from a Character

转载 作者:行者123 更新时间:2023-11-28 06:47:40 28 4
gpt4 key购买 nike

这个问题的灵感来自于一个关于如何在 Swift 中递减字符的 ASCII 值的类似问题:How to decrement a Character that contains a digit?

UnicodeScalar struct 提供了一个接口(interface)来表示 Unicode scalar value在 swift 。我正在尝试扩展 UnicodeScalar并创建一个接受 Swift Character 的初始化器并返回 UnicodeScalar那的值(value)Character .

创建 UnicodeScalar来自String很容易。 _NSSimpleObjCType 有一个私有(private)初始化器(符合 UnicodeScalar )它接受字符串的第一个字符并将其传递给 rawValue构造函数。

NSObjCRuntime.swift

extension _NSSimpleObjCType {
init?(_ v: UInt8) {
self.init(rawValue: UnicodeScalar(v))
}

init?(_ v: String?) {
if let rawValue = v?.unicodeScalars.first {
self.init(rawValue: rawValue)
} else {
return nil
}
}
}

结果:

let stringScalar = UnicodeScalar("8") // 56 (U+0038)

来自Character从字面上看,这更冗长。我需要手动转换 CharacterString , 得到它的 unicodeScalars ,并返回数组中的第一个标量:

let c = Character("8")
let str = String(c)
if let scalar = str.unicodeScalars.first { // 56 (U+0038)
// ...
}

我尝试 init在扩展中:

extension UnicodeScalar {

init?(_ v: Character?) {
if let rawValue = String(v).unicodeScalars.first {
String(v).unicodeScalars.first
self.init(rawValue)
} else {
return nil;
}
}
}

用“8”测试这个新的 init 返回 U+004F ( "O" ),而我期望它返回 "8" (U+0038).

let testChar = Character("8")
let scalar = UnicodeScalar(testChar) // U+004F

我还尝试使用 self.init(String(v)) 调用字符串初始值设定项 |在init上面,但我收到错误 'UnicodeScalar.init' with an argument list of type '(String)' .我知道情况并非如此,因为 String初始值设定项随 _NSSimpleObjCType 上的扩展一起提供.

我的初始化程序在哪里失败了?

最佳答案

你的初始化方法

init?(_ v: Character?)

接受一个可选字符作为参数,因此字符串插值 String(v) 返回字符串

Optional("8")

以大写“O”作为第一个 Unicode 标量 ...

将参数类型更改为非可选(或展开参数)应该可以解决问题。

关于ios - 扩展 UnicodeScalar : Creating an init method from a Character,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35852624/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com