- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题的灵感来自于一个关于如何在 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
构造函数。
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
在扩展中:
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/
我是一名优秀的程序员,十分优秀!