在Swift 3中,您可以选择三种RandomNumbersSequence
实现之一来解决您的问题。
1. 使用符合 Sequence
协议的结构体和符合 IteratorProtocol
协议的结构体
以下的 Playground 代码展示了如何实现一个符合 Sequence
协议的 RandomNumbersSequence
结构体,并使用符合 IteratorProtocol
协议的 RandomNumbersIterator
结构体:
import Darwin
struct RandomNumbersIterator: IteratorProtocol {
let maxNum: Int
var n = 0
init(maxNum: Int) {
self.maxNum = maxNum
}
mutating func next() -> Int? {
n += 1
return n <= self.maxNum ? Int(arc4random_uniform(10)) : nil
}
}
struct RandomNumbersSequence: Sequence {
let maxNum: Int
init(maxNum: Int) {
self.maxNum = maxNum
}
func makeIterator() -> RandomNumbersIterator {
return RandomNumbersIterator(maxNum: maxNum)
}
}
用法 #1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
用法 #2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
用法 #3:
let randomSequence = RandomNumbersSequence(maxNum: 3)
var randomGenerator = randomSequence.makeIterator()
randomGenerator.next() // may return: 4
randomGenerator.next() // may return: 8
randomGenerator.next() // may return: 3
randomGenerator.next() // will return: nil
2. 使用符合Sequence
和IteratorProtocol
协议的结构体
以下Playground代码展示了如何实现一个符合Sequence
和IteratorProtocol
协议的RandomNumbersSequence
结构体:
import Darwin
struct RandomNumbersSequence: Sequence, IteratorProtocol {
let maxNum: Int
var n = 0
init(maxNum: Int) {
self.maxNum = maxNum
}
mutating func next() -> Int? {
n += 1
return n <= self.maxNum ? Int(arc4random_uniform(10)) : nil
}
}
使用方法 #1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
用法 #2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
用法 #3:
var randomSequence = RandomNumbersSequence(maxNum: 3)
randomSequence.next() // may return: 4
randomSequence.next() // may return: 8
randomSequence.next() // may return: 3
randomSequence.next() // will return: nil
3. 使用AnyIterator
和符合Sequence
协议的结构体
作为先前实现的替代方案,您可以在符合Sequence
协议的结构体内部使用AnyIterator<T>
作为makeIterator
方法的返回类型。以下Playground代码展示了如何在您的RandomNumbersSequence
结构体中实现它:
import Darwin
struct RandomNumbersSequence: Sequence {
let maxNum: Int
init(maxNum: Int) {
self.maxNum = maxNum
}
func makeIterator() -> AnyIterator<Int> {
var n = 0
let iterator: AnyIterator<Int> = AnyIterator {
n += 1
return n <= self.maxNum ? Int(arc4random_uniform(10)) : nil
}
return iterator
}
}
用法 #1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
用法 #2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
用法 #3:
let randomSequence = RandomNumbersSequence(maxNum: 3)
let randomGenerator = randomSequence.makeIterator()
randomGenerator.next() // may return: 4
randomGenerator.next() // may return: 8
randomGenerator.next() // may return: 3
randomGenerator.next() // will return: nil
let seq = RandomNumbersSequence(maxNum: 5)
,然后执行for i in seq { }
,你将获得5个随机数? - Airspeed Velocity