定义自定义PURE Swift字符集

时间:2015-01-28 02:38:17

标签: string swift character-encoding character nscharacterset

因此,使用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 }
}

这可能是一个非常有问题的问题。但是我想看看Swifters的想法。

1 个答案:

答案 0 :(得分:2)

您已经可以通过初始化字符串并使用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需要多做一些工作,但我知道它有一个功能......

编辑:这将使用'%'后跟字符的十六进制值替换characterSet中的字符:

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"

再次解码更具挑战性,但我确信可以做到......