2

因此,使用 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 是怎么想的。

4

1 回答 1

2

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

let vowels = "aeiou"

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

就您的encodedecode功能而言,您只是想获得字符的 8 位或 16 位编码吗?如果是这种情况,那么只需将它们转换为 String 并访问那里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"

再次,解码更具挑战性,但我确信它可以完成......

于 2015-01-28T02:51:51.183 回答