这个问题的灵感来自一个类似的问题,关于如何减少Swift中字符的ASCII值:How to decrement a Character that contains a digit?
UnicodeScalar
结构提供了一个表示Swift中Unicode scalar value的接口。我正在尝试扩展UnicodeScalar
并创建一个接收Swift Character
的初始值设定项,并返回UnicodeScalar
的{{1}}值。
从Character
创建UnicodeScalar
非常简单。 String
有一个私有初始值设定项(符合_NSSimpleObjCType
),它接受字符串的第一个字符并将其传递给UnicodeScalar
构造函数。
rawValue
结果:
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
转换为Character
,获取其String
,然后返回数组中的第一个标量:
unicodeScalars
我在扩展程序中let c = Character("8")
let str = String(c)
if let scalar = str.unicodeScalars.first { // 56 (U+0038)
// ...
}
的尝试:
init
使用" 8"测试这个新的init。返回U + 004F(extension UnicodeScalar {
init?(_ v: Character?) {
if let rawValue = String(v).unicodeScalars.first {
String(v).unicodeScalars.first
self.init(rawValue)
} else {
return nil;
}
}
}
),我希望它返回"O"
(U + 0038)。
"8"
我还尝试在上面的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
上提供了扩展程序。
我的初始化程序在哪里失败了?
答案 0 :(得分:1)
您的初始化方法
init?(_ v: Character?)
将可选字符作为参数,因此为字符串
interpolation String(v)
返回字符串
Optional("8")
以大写“O”作为第一个Unicode标量...
将参数类型更改为非可选(或展开 该参数)应解决问题。