一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
同样CharacterSet也是高效存储Unicode编码点(code point)的集合,常用来判断一个字符创是否包含某个子集(比如字母数字 alphanumerics 或者数字 decimalDigits) 中的字符。和 IndexSet 有所不同,CharacterSet并不是一个集合类型,名字是从 Objective-C 导入时生成的
属性 | 描述 |
---|---|
CharacterSet.alphanumerics | 字母和数字的组合,包含大小写, 不包含小数点 |
CharacterSet.capitalizedLetters | 字母,首字母大写,Lt类别 |
CharacterSet.decimalDigits | 0-9的数字,也不包含小数点 |
CharacterSet.whitespaces | 空格 |
CharacterSet.whitespacesAndNewlines | 空格和换行 |
CharacterSet.letters | 所有英文字母,包含大小写 65-90 97-122 |
CharacterSet.lowercaseLetters | 小写英文字母 97-122 |
CharacterSet.uppercaseLetters | 大写英文字母 65-90 |
CharacterSet.nonBaseCharacters | 非基础字符 M* |
CharacterSet.illegalCharacters 不 | 合规字符,没有在Unicode 3.2 标准中定义的字符 |
CharacterSet.punctuationCharacters | 标点符号,连接线,引号什么的 P* |
CharacterSet.symbols | 符号,包含S* 所有内容,运算符,货币符号什么的 |
CharacterSet.newlines | 返回一个包含换行符的字符集,U+000A ~ U+000D, U+0085, U+2028, and U+2029 |
CharacterSet.symbols | 符号,包含S* 所有内容,运算符,货币符号什么的 |
inverted | 相反的字符集。例如CharacterSet.whitespaces.inverted 就是没有空格 |
// 去掉首尾空格
let example = " abc ".trimmingCharacters(in: CharacterSet.whitespaces)
print(example)
// abc
//验证密码是否只包含数字
let password = "123"
print(password.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil)
// true
//url编码
let url = URL(string: "http://www.api.test.com".addingPercentEncoding(withAllowedCharacters: CharacterSet.urlHostAllowed)!)
// 自定义
let str2 = "#/%/<>?@"
let custom = CharacterSet(charactersIn: "#").inverted
let result = str2.addingPercentEncoding(withAllowedCharacters: custom) ?? ""
print(result) //输出 %23/%/<>?@
复制代码
- CharacterSet.urlHostAllowed: 被转义的字符有 "#%/<>?@^`{|}
- CharacterSet.urlPathAllowed: 被转义的字符有 "#%;<>?[]^`{|}
- CharacterSet.urlUserAllowed: 被转义的字符有 #%/<>?@^`{|}
- CharacterSet.urlQueryAllowed: 被转义的字符有 "#%<>[]^`{|}
- CharacterSet.urlPasswordAllowed 被转义的字符有 "#%/:<>?@[]^`{|}
CharacterSet.urlHostAllowed包含的是所有不需要被转码的字符,可以用两句代码验证:
let unicode = "1".unicodeScalars.flatMap{ $0 }[0]
print(CharacterSet.urlHostAllowed.contains(unicode)) //输出TRUE
复制代码
在闭包中使用集合
extension Sequence where Element: Hashable {
func unique() -> [Element] {
var seen: Set<Element> = []
return filter { element in
if seen.contains(element) {
return false
} else {
seen.insert(element)
return true
}
}
}
}
[1,2,3,12,1,3,4,5,6,4,6].unique() // [1, 2, 3, 12, 4, 5, 6]
复制代码
上面这个方法让我们可以找到序列中的所有不重复的元素,并且通过元素必须满足 Hashable 这个约束来维持它们原来的顺序。在我们传递给 filter 的闭包中,我们使用了一个外部的 seen 变量,我们可以在闭包里访问和修改它的值