根据SWIFT 5文档,String的方法randomElement()
复杂度O(1)
或O(*n*)
取决于符合RandomAccessCollection
协议。
因此,我想知道如何使字符串复杂度的随机数()成为O(1)的情况。
我的绳子只是:
let letters = "abcdefghijklmnopqrstuvwxyz"
问题:
如何检查特定字符串是否符合RandomAccessCollection?
如何从字符串中创建/移除对RandomAccessCollection协议的一致性?
最佳答案
randomElement
是Collection
协议的要求,如您所见here。
因此,通过实现这个方法,String
仅仅是符合Collection
的,文档注释只是从Collection
中的原始注释复制粘贴而来。
如果您在Collection
而不是String
的上下文中阅读文档注释,那么它就更有意义了。也就是说,如果self
也是一个RandomAccessCollection
,那么它是o(1),否则它是o(n)。String
不符合RandomAccessCollection
,如您所见here,因此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
关于swift - Swift-使String符合RandomAccessCollection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56311257/