Mit Swift 3, eine der drei RandomNumbersSequence
Implementierungen, um Ihr Problem zu lösen wählen können.
1. eine Struktur verwenden, die Sequence
Protokoll und eine Struktur entspricht, die IteratorProtocol
Protokoll
Der folgende Spielplatz Code zeigt, wie implementieren eine RandomNumbersSequence
Struktur, die zu Sequence
entspricht und dass verwendet eine RandomNumbersIterator
Struktur entspricht das entspricht IteratorProtocol
Protokoll:
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)
}
}
Usage # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Usage # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Usage # 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. eine Struktur verwenden, die
Die folgende Spielplatz Code Sequence
und IteratorProtocol
Protokollen konform zeigt, wie man eineimplementiertstruct, die Sequence
und IteratorProtocol
Protokolle entspricht:
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
}
}
Usage # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Usage # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Usage # 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.Mit AnyIterator
und einer Struktur, die
Als Alternative zur bisherigen Umsetzung Sequence
entspricht, können Sie
AnyIterator<T>
als Rückgabetyp der
makeIterator
Methode in Ihrer
Sequence
Protokoll entspricht Struktur verwenden. Der folgende Spielplatz Code zeigt, wie es implementieren mit Ihrem
RandomNumbersSequence
Struktur:
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
}
}
Usage # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Usage # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Usage # 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
Nur um zu überprüfen - Sie versuchen zu schreiben e eine Sequenz, die x Anzahl von Zufallszahlen liefert? I.e. Wenn Sie 'let seq = RandomNumbersSequence (maxNum: 5)' erstellen, dann tun Sie 'für i in seq {}' Sie erhalten 5 Zufallszahlen? –