RandomAccessCollection

RandomAccessCollection

根据SWIFT 5文档,String的方法randomElement()复杂度O(1)O(*n*)取决于符合RandomAccessCollection协议。
swift - Swift-使String符合RandomAccessCollection-LMLPHP
因此,我想知道如何使字符串复杂度的随机数()成为O(1)的情况。
我的绳子只是:

let letters = "abcdefghijklmnopqrstuvwxyz"

问题:
如何检查特定字符串是否符合RandomAccessCollection?
如何从字符串中创建/移除对RandomAccessCollection协议的一致性?

最佳答案

randomElementCollection协议的要求,如您所见here
因此,通过实现这个方法,String仅仅是符合Collection的,文档注释只是从Collection中的原始注释复制粘贴而来。
如果您在Collection而不是String的上下文中阅读文档注释,那么它就更有意义了。也就是说,如果self也是一个RandomAccessCollection,那么它是o(1),否则它是o(n)。
String不符合RandomAccessCollection,如您所见here,因此String.randomElement为o(n)。
编辑:
要检查某事物是否是RandomAccessCollectionCharacter,不能直接使用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

关于swift - Swift-使String符合RandomAccessCollection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56311257/

10-09 13:23