Character 中的 == 是如何定义的?

Posted

技术标签:

【中文标题】Character 中的 == 是如何定义的?【英文标题】:How is == in Character defined? 【发布时间】:2020-04-14 08:58:22 【问题描述】:

我看到“é”("\uE9",1 个代码点)和“e”+accent("\u65\u301",2 个代码点)是相等的,这很棒。

Character==的documentation继承自Equatable,不解释其规则。另一方面,我环顾四周 Annex #29 没有运气。 Swift 是否实现了自己的逻辑?

在任何一种情况下,Swift 中的字符相等性是如何确定的?

【问题讨论】:

我认为您未提出的问题的答案是,“您需要先手动规范化这两个字符”。 【参考方案1】:

由于Swift 是一种开源语言,您可以在 GitHub 上查看内置方法的实现。

你可以找到Characterhere的相等运算符。

extension Character: Equatable 
  @inlinable @inline(__always)
  @_effects(readonly)
  public static func == (lhs: Character, rhs: Character) -> Bool 
    return lhs._str == rhs._str
  

如您所见,在内部,Character 可以从 String 初始化,Character== 运算符使用该内部 String 属性来比较两个 Characters。

@frozen
public struct Character 
  @usableFromInline
  internal var _str: String

  @inlinable @inline(__always)
  internal init(unchecked str: String) 
    self._str = str
    _invariantCheck()
  

你可以在StringComparable.swift中找到==对于String的实现

【讨论】:

以上是关于Character 中的 == 是如何定义的?的主要内容,如果未能解决你的问题,请参考以下文章

根据预定义的字符类型拆分字符串

char转int,int转char

Character.digit()的意义

Character 类

数据库中的十种数据类型都是啥

插入到mysql的是中文,但select的时候显示乱码