的enumerateAttribute(_:in:options:using:)
方法NSAttributedString
似乎等同于 type 的任意实例Any
。当然,Any
不符合Equatable
,所以这应该是不可能的。
问题:该方法如何将一个实例与Any
另一个实例进行比较?
上下文:在 Swift 中,我是 NSTextStorage 的子类,并且需要在 Swift中提供我自己的此方法的实现。
观察:
NSAttributedString
属性以键值对的形式出现,键是 typeNSAttributedString.Key
的实例,值是 type 的实例Any?
,每一对都与字符串中的一个或多个字符范围相关联。至少,从外部看,数据结构是这样的;内部实现是不透明的。- 该
enumerateAttribute
方法遍历 a 的整个范围NSAttributedString
,有效地识别与指定键对应的每个不同值,以及该值适用的范围。 - 对应于给定键的值可以是多种不同的类型。
NSAttributedString
似乎无法知道这些Any
值可能是什么基础类型,因此似乎无法进行类型转换以比较两个给定Any
值。- 然而,该方法以某种方式基于值的差异来区分字符串的范围
Any
。 - 有趣的是,即使底层类型不符合
Equatable
. 我认为这是一个线索,表明该方法可能正在使用某种反射来执行比较。 - 更有趣的是,该方法甚至在底层类型确实符合时区分值,
Equatable
并且两个值之间的差异是特定实现Equatable
有意忽略的差异。换句话说,即使a == b
返回 true,如果 a 和 b 被忽略的不透明属性存在差异==
,该方法也会将值视为不同,而不是相同。 - 我假设该方法连接到 ObjC 中的实现。