Почему startIndex не равен endIndex, смещенному в позицию startIndex в строке в Swift? - PullRequest
1 голос
/ 09 мая 2019

Посмотрите на программу:

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 ]

3 голосов
/ 10 мая 2019

Равенство между двумя String.Index es определяется в старших 50 битах _rawBits, или 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 бит.

2 голосов
/ 09 мая 2019

Необработанные биты индекса являются подробностями реализации. Как вы видите в своем примере, эти два значения равны (они возвращают true для ==).

Что касается текущей реализации, установлен бит 8, который не является частью позиции. Это кэшированное значение для смещения следующего кластера графем, которое находится на расстоянии 1 байта. Он говорит вам, что есть следующий байт для следующей графемы (которую он не знал, пока вы не вычислили endIndex).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...