Với Swift 3, bạn có thể chọn một trong ba RandomNumbersSequence
triển khai để giải quyết vấn đề của bạn.
1. Sử dụng một cấu trúc mà phù hợp với Sequence
giao thức và một cấu trúc mà phù hợp với giao thức IteratorProtocol
Mã Sân chơi sau đây cho thấy làm thế nào để thực hiện một struct RandomNumbersSequence
rằng phù hợp với Sequence
và có sử dụng một cấu trúc RandomNumbersIterator
mà phù hợp với IteratorProtocol
giao thức:
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)
}
}
Cách sử dụng # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Cách sử dụng # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Cách sử dụng # 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. Sử dụng một cấu trúc mà phù hợp với Sequence
và IteratorProtocol
giao thức
Mã Sân chơi sau cho thấy cách triển khai RandomNumbersSequence
struct đó phù hợp với Sequence
và IteratorProtocol
giao thức:
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
}
}
Cách sử dụng # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Cách sử dụng # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Cách sử dụng # 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.Sử dụng AnyIterator
và một cấu trúc mà phù hợp với Sequence
Để thay thế cho việc thực hiện trước đó, bạn có thể sử dụng AnyIterator<T>
như kiểu trả về của phương pháp makeIterator
bên Sequence
giao thức của bạn phù hợp với cấu trúc. Mã sân chơi sau đây cho thấy làm thế nào để thực hiện nó với RandomNumbersSequence
struct của bạn:
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
}
}
Cách sử dụng # 1:
for value in RandomNumbersSequence(maxNum: 3) {
print(value)
}
/*
may print:
5
7
3
*/
Cách sử dụng # 2:
let randomArray = Array(RandomNumbersSequence(maxNum: 3))
print(randomArray)
/*
may print: [7, 6, 1]
*/
Cách sử dụng # 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
Chỉ cần kiểm tra - bạn đang cố gắng viết e một chuỗi phục vụ x số ngẫu nhiên? I E. nếu bạn tạo 'let seq = RandomNumbersSequence (maxNum: 5)', sau đó làm 'for i in seq {}' bạn sẽ nhận được 5 số ngẫu nhiên? –