В Swift 3 вы можете выбрать одну из трех RandomNumbersSequence
реализаций, чтобы решить вашу проблему.
1. Использование структуры, соответствующей Sequence
протоколу, и структуры, соответствующей IteratorProtocol
протоколу
Следующий код игровой площадки показывает, как реализовать структуру RandomNumbersSequence
, соответствующую Sequence
и использующую структуру RandomNumbersIterator
, соответствующую протоколу IteratorProtocol
:
import Darwin // required for arc4random_uniform
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)
}
/*
may print:
5
7
3
*/
Использование № 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
.
Следующий код игровой площадки показывает, как реализовать структуру RandomNumbersSequence
, соответствующую протоколам Sequence
и IteratorProtocol
:
import Darwin // required for arc4random_uniform
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)
}
/*
may print:
5
7
3
*/
Использование № 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
В качестве альтернативы предыдущей реализации вы можете использовать AnyIterator<T>
как возвращаемый тип makeIterator
метода внутри вашей Sequence
структуры, соответствующей протоколу. Следующий код игровой площадки показывает, как реализовать это с помощью вашей RandomNumbersSequence
структуры:
import Darwin // required for arc4random_uniform
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)
}
/*
may print:
5
7
3
*/
Использование № 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
person
Imanou Petit
schedule
19.12.2015
let seq = RandomNumbersSequence(maxNum: 5)
, тоfor i in seq { }
вы получите 5 случайных чисел? - person Airspeed Velocity   schedule 03.04.2015