Swift -使字符串符合Random数组集合

yc0p9oo0  于 2023-10-15  发布在  Swift
关注(0)|答案(3)|浏览(99)

根据Swift 5文档,String有方法randomElement(),复杂度为O(1)O(*n*),具体取决于是否符合RandomAccessCollection协议。

因此,我想知道**如何使字符串复杂度的randomElement()为O(1)的情况。
我的字符串是:

let letters = "abcdefghijklmnopqrstuvwxyz"

问题:

1.我如何检查我的特定字符串是否符合RandomAnswer Collection?
1.如何从字符串中创建/删除与Random Collection协议的一致性?

mw3dktmi

mw3dktmi1#

字符串永远不是随机访问集合。如果这是你想要的,投一个数组。

slmsl1lt

slmsl1lt2#

randomElementCollection协议的要求,如您所见here
所以String仅仅是通过实现这个方法来遵循Collection,文档注解只是从Collection中的原始注解复制粘贴而来。
如果您在Collection而不是String的上下文中阅读文档注解,则会更有意义。这是说如果self也是RandomAccessCollection,那么它的时间复杂度是O(1),否则它的时间复杂度是O(n)。
String * 不符合RandomAccessCollection,所以String.randomElement是O(n)。
编辑:
要检查某个东西是否是CharacterRandomAccessCollection,不能直接使用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
dohp0rv5

dohp0rv53#

Swift中的Array已经符合RandomAccessCollection

相关问题