因此,使用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的想法。
答案 0 :(得分:2)
您已经可以通过初始化字符串并使用contains
全局函数来测试字符集中的成员资格:
let vowels = "aeiou"
let isVowel = contains(vowels, "i") // isVowel == true
就你的encode
和decode
函数而言,你是否只是试图获得字符的8位或16位编码?如果是这种情况,那么只需将它们转换为字符串并访问utf8
或utf16
属性:
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"
再次解码更具挑战性,但我确信可以做到......