为什么在Swift中StartIndex不等于endIndex移到String中的startIndex位置?

时间:2019-05-09 19:07:46

标签: swift string indexing

看程序:

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表示字符串中的相同位置。为什么?

2 个答案:

答案 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 &>> 14256 &>> 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才知道。)