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