Swift - привести строку в соответствие с RandomAccessCollection - PullRequest
1 голос
/ 26 мая 2019

Согласно документам Swift 5, String имеет метод randomElement() со сложностью O(1) или O(*n*) в зависимости от соответствия протоколу RandomAccessCollection.

randomElement method description

Поэтому мне интересно , как сделать случаи, когда randomElement () сложности String будет O (1).

Моя строка просто:

let letters = "abcdefghijklmnopqrstuvwxyz"

Вопросы:

  1. Как проверить, соответствует ли моя конкретная строка RandomAccessCollection?
  2. Как создать / удалить соответствие протоколу RandomAccessCollection из строки?

Ответы [ 2 ]

1 голос
/ 26 мая 2019

randomElement является требованием протокола Collection, как вы можете видеть здесь .

Так что String просто соответствует Collection путем реализации этого метода,и комментарий к документации - это просто копия-вставка из исходного в Collection.

Если вы читаете комментарий к документации в контексте Collection вместо String, это имеет гораздо больший смысл,Он говорит, что если self также является RandomAccessCollection, то это O (1), в противном случае это O (n).

String не не соответствует RandomAccessCollection, как вы можете видеть здесь , поэтому String.randomElement - это O (n).

РЕДАКТИРОВАТЬ:

Чтобы проверить, является ли что-то RandomAccessCollection из Character, вы не можете сделать это напрямую с is, потому что RandomAccessCollection имеет связанные типы.Один из способов сделать это - определить функцию, которая принимает параметр ограниченного типа:

let letters = Array("abcdefghijklmnopqrstuvwxyz")
func f<T>(_ x: T) where T : RandomAccessCollection, T.Element == Character {}
f(letters) // if this compiles, then Array<Character> conforms to RandomAccessCollection and Element is Character
1 голос
/ 26 мая 2019

Строка никогда не является коллекцией произвольного доступа.Если это то, что вы хотите, бросьте в массив.

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