Как вы знаете, Cocoa - это Objective-C, поэтому это объекты NSDictionary Objective-C, а не объекты Swift Dictionary.Таким образом, для сравнения равенства используется Objective-C isEqual
, а не Swift ==
.Мы не связаны строгой типизацией Swift, протоколом Equatable или чем-то еще из Swift.
Для иллюстрации приведем медленную и глупую, но эффективную реализацию обнаружения запуска стиля:
let s = NSMutableAttributedString(
string: "howdy", attributes: [.foregroundColor:UIColor.red])
s.addAttributes([.foregroundColor:UIColor.blue],
range: NSRange(location: 2, length: 1))
var lastatt = s.attributes(at: 0, effectiveRange: nil)
for ix in 1..<5 {
let newatt = s.attributes(at:ix, effectiveRange:nil)
if !(newatt as NSDictionary).isEqual(to: lastatt) {
print("style run ended at \(ix)")
lastatt = newatt
}
}
Это правильно печатает:
style run ended at 2
style run ended at 3
Таким образом, поскольку всегда можно сравнить атрибуты в одном индексе с атрибутами в другом, можно реализовать перечисление атрибутов в Swift.(Является ли это хорошей идеей, другой вопрос.)