定义自定义 PURE Swift 字符集

Defining a custom PURE Swift Character Set

因此,使用 Foundation,您可以使用 NSCharacterSet 来定义字符集并测试字符串中的字符成员资格。我想在没有 Cocoa 类 的情况下这样做,但是以纯粹的 Swift 方式。

理想情况下,代码可以这样使用:

struct ReservedCharacters: CharacterSet {
    characters "!", "#", "$", "&", ... etc.

    func isMember(character: Character) -> Bool

    func encodeCharacter(parameters) { accepts a closure }

    func decodeCharacter(parameters) { accepts a closure }
}

这可能是一个非常沉重的问题。但我想看看你们 Swift 人的想法。

您已经可以通过初始化字符串并使用 contains 全局函数来测试字符集中的成员资格:

let vowels = "aeiou"

let isVowel = contains(vowels, "i") // isVowel == true

就您的 encodedecode 函数而言,您只是想获取字符的 8 位或 16 位编码吗?如果是这种情况,则只需将它们转换为字符串并访问 utf8utf16 属性:

let char = Character("c")

let a = Array(String(char).utf8)
println()          // This prints [99]

Decode 会需要更多的工作,但我知道有一个功能...

编辑:这会将字符集中的字符替换为“%”,后跟字符的十六进制值:

let encode: String -> String = { s in
    reduce(String(s).unicodeScalars, "") { x, y in
        switch contains(charSet, Character(y)) {
        case true:
            return x + "%" + String(y.value, radix: 16)
        default:
            return x + String(y)
        }
    }
}

let badURL = "http://why won't this work.com"
let encoded = encode(badURL)
println(encoded)   // prints "http://why%20won%27t%20this%20work.com"

再次解码,有点挑战性,但我相信它可以完成...