我学得很快。我想使用一个自定义类来循环[能够 for...in 循环],如 Array。以下是迄今为止我尝试过的给定示例代码。有问题的课程是“GuestManager”,它持有客人的私人集合 [Guest 类的对象]
import Foundation
class Guest{
var guestId: String
var guestName: String
init(gId: String, name: String){
self.guestId = gId
self.guestName = name
}
}
class GuestManager: GeneratorType, SequenceType{
private var guests = [Guest]?()
private var nextIndex: Int
init(guests: [Guest]){
self.guests = guests
self.nextIndex = 0
}
func next() -> Guest? {
if self.nextIndex > (self.guests?.count)! - 1 {
self.nextIndex = 0
return nil
}
let currentGuest = self.guests![self.nextIndex]
self.nextIndex += 1
return currentGuest
}
subscript(aGuestId gID: String) -> Guest{
return (self.guests?.filter({$0.guestId == gID}).first)!
}
}
我不想创建符合 GeneratorType 和 SequenceType 协议的单独类。相反,我创建了一个符合这两种协议的类。
以下是我的一些问题:
我想知道这是否是拥有自定义集合类型的正确方法?
我们可以使用下标作为一种基于属性执行搜索的方法,例如上面示例代码中的“subscript(aGuestId gID: String)”吗?
从上面示例代码中的 next() 函数实现的代码中可以清楚地看出,当迭代结束时重置“nextIndex”。如何处理我们在 for...in 循环中使用 break 语句的情况,如下所示:
for aGuest in guestManager{//guestManager an instance of GuestManager class instantiated with several guest objects print(aGuest.guestName) } for aG in guestManager{ print(aG.guestId) break }
在第二个 for 循环中,代码在获取第一个 Element [在这种情况下为来宾对象] 后中断。随后的 for 循环将从集合中的索引 1 开始,而不是从 0 开始。无论如何要处理这种中断情况,以便对于每个后续的 for 循环,索引始终设置为 0?
谢谢
编辑:似乎可以使用以下代码修复“nextIndex”重置问题[在 GuestManager 类中添加]用于 generate() 方法实现
func generate() -> Self {
self.nextIndex = 0
return self
}