
首先,让我们定义一个可以生成随机数的协议。这个协议只包含一个函数-----返回Self类型的名为arbitrary()的函数,返回的Self也就是实现了Arbitrary协议的这个类或者结构体的实例
protocol Arbitrary {
static func arbitrary() -> Self
}
然后,让我们来写一个Int的🌰。使用标准库中的arc4random()函数并将其返回值转换为Int。注意:这里只能生成正整数。事实上,一个完整实现的库也应能够生成负整数。
extension Int: Arbitrary {
static func arbitrary() -> Int {
return Int(arc4random())
}
}
现在我们可以生成随机整数
Int. arbitrary()
结果为:
/*
6278582
*/
如果要生成随机字符串,还需要多做一点点工作。首先是生成随机字符:
extension Character: Arbitrary {
static func arbitrary() -> Character {
return Character(UnicodeScalar(Int.random(from: 65, to: 90))!)
}
}
extension Int {
static func random(from: Int, to: Int) -> Int {
return from + (Int(arc4random()) % (to - from))
}
}
这里我们使用对于Int的扩展,自定义的random()函数,
最后就是获得随机字符串的方法
extension String: Arbitrary {
static func arbitrary() -> String {
let randomLength = Int.random(from: 0, to: 40)
let randomCharacters = tabulate(times: randomLength) { _ in
Character.arbitrary()
}
return String(randomCharacters)
}
static func tabulate<A>(times: Int, transform: (Int) -> A) -> [A] {
return (0..<times).map(transform)
}
}
网友评论