扩展UnicodeScalar:从角色

时间:2016-03-07 19:45:56

标签: ios swift unicode character

这个问题的灵感来自一个类似的问题,关于如何减少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构造函数。

NSObjCRuntime.swift

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上提供了扩展程序。

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

1 个答案:

答案 0 :(得分:1)

您的初始化方法

init?(_ v: Character?)

可选字符作为参数,因此为字符串 interpolation String(v)返回字符串

Optional("8")

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

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