5

我只是想知道 Swift 中的(倒置的)CharacterSet 是如何工作的。

假设我有以下两个字符集:

let invertedNumbers = CharacterSet(charactersIn: "0123456789").inverted
let numbers = CharacterSet(charactersIn: "0123456789")

当我使用打印功能记录两个字符集时

print(numbers) 

它在控制台中的显示与

print(invertedNumbers)

那就是

<CFCharacterSet Items(U+0030 U+0031 U+0032 U+0033 U+0034 U+0035 U+0036 U+0037 U+0038 U+0039)>

但是它们怎么可能完全一样呢?我很困惑,因为它们不是真的。当我问倒置的是否包含“a”时,它说true。另一方面,不倒置的说false。而且我喜欢它的工作方式,但是倒置的日志记录不是错误的吗?

4

2 回答 2

0

倒转字符集在 Swift 中确实有效,尽管您不能真正打印它。

例如,如果我想对一组字符进行百分比编码,那么我可以在 POST 中发送它:

let myPassword = "Hi+You?"
var charset1 = CharacterSet(charactersIn: "#%;<>?[\\]^'\"{|}&+")
let urlwithPercentEscapes = myPassword.addingPercentEncoding( withAllowedCharacters: charset1.inverted)
print(urlwithPercentEscapes)

当我打印 urlwithPercentEscapes 时,我将对该字符组中的任何字符进行百分比编码,因为我正在显示“withAllowedCharacters: charset1.inverted”。如果我使用“ withAllowedCharacters: charset1”,它将对不在该列表中的每个字符进行百分比编码。

于 2020-05-18T20:31:38.137 回答
0

CharacterSet 有一个十进制数字、字母、大写字母、符号等的列表。有些字母字符可能你能理解,但有些则不能,因为 CharacterSet 考虑其他字母字符非英语语言(UTF8、UTF16、UTF32)。

你有两个可能的结果:

1 let allowed_characters = CharacterSet.alphanumerics
2 let disallowed_characters = CharacterSet.alphanumerics.inverted

1 有一个包含所有允许的字母数字字符的列表。

2 有一个列表,其中包含您设置的允许字符中的所有外部字符。

换句话说,你可以...

extension String {
    var isAlphanumeric: Bool {
      let allowed_characters = CharacterSet.alphanumerics
      let disallowed_characters = allowed_characters.inverted
    
      let range = rangeOfCharacter(from: disallowed_characters, options: .literal, range: nil)
      // allowed validation should be range: != nil
      // disallowed should be: range == nil
      return range == nil
   }}

"*".isAlphanumeric // prints false
"hello123".isAlphanumeric // true
"Olá".isAlphanumeric // true

希望对你有帮助✌️

于 2022-02-03T03:21:10.893 回答