Swift2 如何从CollectionType中获取随机元素?

Swift2 如何从CollectionType中获取随机元素?,swift2,Swift2,这是我的示例代码 import Foundation // ar4random_uniform extension CollectionType where Self.Index.Distance == Int { var randomElement: Self.Generator.Element? { if !isEmpty { let i = Int(arc4random_uniform(UInt32(count)))

这是我的示例代码

import Foundation // ar4random_uniform

extension CollectionType where Self.Index.Distance == Int {
    var randomElement: Self.Generator.Element? {
        if !isEmpty {
            let i = Int(arc4random_uniform(UInt32(count)))
            return self[startIndex.advancedBy(i)]
        } else {
            return nil
        }
    }
}

let arr = ["alfa", "beta","gama"]
let view = "abcdefghijklmnopqrstuvwxyz".characters
let dict:Dictionary<Int,Any> = [1:"a",2:true,3:1]
let range = Range<Int>(start: -99, end: 100)
let b = UnsafeMutablePointer<Int>.alloc(10)
for i in 0..<10 { (b+i).memory = 1000*i }
let buff = UnsafeMutableBufferPointer<Int>(start: b, count: 10)
for i in 0...10 {
    print(arr.randomElement!,
        view.randomElement!,
        dict.randomElement!,
        range.randomElement!,
        buff.randomElement!)
}

/*
gama z (1, "a") 62 2000
alfa i (1, "a") 4 9000
alfa f (1, "a") 14 6000
gama g (1, "a") 68 8000
beta a (2, true) 42 7000
alfa y (1, "a") -76 1000
alfa i (1, "a") 76 4000
gama f (2, true) 79 3000
beta s (2, true) 46 3000
beta l (1, "a") -17 9000
gama q (3, 1) 62 9000
*/
<代码>导入基础//AR4随机一致性 扩展集合类型,其中Self.Index.Distance==Int{ var随机元素:Self.Generator.Element{ 如果!我是空的{ 设i=Int(arc4random_均匀(UInt32(count))) 返回自我[startIndex.advancedBy(i)] }否则{ 归零 } } } 设arr=[“阿尔法”、“贝塔”、“伽马”] let view=“abcdefghijklmnopqrstuvxyz”。字符 让dict:Dictionary=[1:a],2:true,3:1] 让范围=范围(开始:-99,结束:100) 设b=unsafemeutablepointer.alloc(10) 因为我在0。。 因此,每个
索引.Distance
必须符合
\u-SignedIntegerType
。每个
\u签名的整数类型
都承诺在
IntMax
之间进行转换(可用的最宽整数):

将这两个事实放在一起,我们可以计算一个随机索引(最多231-1个元素;如果集合大于此值,这将崩溃):


谢谢你,罗布!我也探讨了同样的问题,这就是为什么我无法理解,为什么我在编写这个简单的扩展时没有指定'where Self.Index.Distance==Int'。
typealias Distance : _SignedIntegerType = Int
init(_: IntMax)
func toIntMax() -> IntMax
let randomDistance = Index.Distance(arc4random_uniform(UInt32(count.toIntMax())).toIntMax())
let randomIndex = startIndex.advancedBy(randomDistance)
return self[randomIndex]