定义自定义 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
就您的 encode
和 decode
函数而言,您只是想获取字符的 8 位或 16 位编码吗?如果是这种情况,则只需将它们转换为字符串并访问 utf8
或 utf16
属性:
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"
再次解码,有点挑战性,但我相信它可以完成...
因此,使用 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
就您的 encode
和 decode
函数而言,您只是想获取字符的 8 位或 16 位编码吗?如果是这种情况,则只需将它们转换为字符串并访问 utf8
或 utf16
属性:
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"
再次解码,有点挑战性,但我相信它可以完成...