看程序:
let s = "1"
print(s.startIndex)
print(s.index(before: s.endIndex))
print(s.index(before: s.endIndex) == s.startIndex)
它返回:
Index(_rawBits: 0)
Index(_rawBits: 256)
true
因此,用rawBits 0和256表示字符串中的相同位置。为什么?
答案 0 :(得分:3)
String.Index
之间的 Equality在_rawBits
的高50位(也称为orderingValue
)上定义如下:
extension String.Index: Equatable { @inlinable @inline(__always) public static func == (lhs: String.Index, rhs: String.Index) -> Bool { return lhs.orderingValue == rhs.orderingValue } }
并且由于0 &>> 14
和256 &>> 14
都等于0
,因此位置相等,因此索引被视为相等。
&>>
是中缀运算符,用于将位向右移位,从而将移位量屏蔽为64位。
答案 1 :(得分:2)
索引的原始位是实现细节。如您在示例中所见,这两个值相等(它们对IComparable
返回true)。
对于当前的实现,位8被置位,它不是该位置的一部分。 That's a cached value for the offset to the next grapheme cluster, which is 1 byte away.告诉您下一个字素有一个字节(直到您计算endIndex才知道。)