【问题标题】:`contains("\n")` of `String` return false while there is a return in the string`String` 的 `contains("\n")` 在字符串中有返回时返回 false
【发布时间】:2020-09-15 13:50:39
【问题描述】:
let a = """
a
️b
"""
a.contains("\n") // false

返回后的字符串中似乎有一个奇怪的字符。

a.forEach(){ c in
    print(Character(String(c)).asciiValue)
}

Output: 
Optional(97)
Optional(10) // the return 
nil
Optional(98)

这是contains 方法的一个错误,导致在返回字符后面跟着一些奇怪的字符时无法识别?

【问题讨论】:

标签: swift


【解决方案1】:

首先,我打印出字符串中的 unicode 标量:

print(a.unicodeScalars.map { $0.value })
// [97, 10, 65039, 98]

发现你的字符串确实包含换行符\n,也就是值10。但是,紧随其后的是 U+FE0F (65039),这是 unicode 中的 variation selectors 之一。

您在这里调用的contains 的重载是contains(StringProtocol),而不是contains(Character)。前者将执行一种“更智能”的比较,或者正如 Xcode 的快速帮助文档所称的那样,“非文字”:

总结

如果 other 非空且包含在 self 中,则返回 true,通过区分大小写的非文字搜索。

讨论

相当于self.rangeOfString(other) != nil

我似乎无法在网上找到此文档...我只能找到 this discussion 显示 contains 足够聪明,可以识别“ß”表示“ss”。

无论如何,重点是,contains 不会进行逐个字符的搜索。它会做任何它认为“有意义”的事情。

这里有几种方法可以让它打印true

  • 如果将变体选择器添加到contains 的参数中,它会打印true

      print(a.contains("\n️")) // you can't see it, but there *is* a variation selector after the n
    
  • 检查unicodeScalars是否包含\n字符:

      print(a.unicodeScalars.contains("\n"))
    
  • 使用contains(Character) 重载:

      print(a.contains("\n" as Character))
    
  • range(of:).literal 选项一起使用:

      print(a.rangeOfString("\n", options: [.literal]) != nil)
    

【讨论】:

    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多