Почему for-in медленнее, чем while в режиме быстрой отладки? Я написал это. Спасибо тем, кто отвечает мне, я мог бы выучить Seqeunce
и IteratorProtocol
.
Поэтому я реализовал пользовательский тип (School
ниже кода), который соответствовал Sequence
. И я проверил профиль времени Xcode.
Но я ничего не могу найти свидетельство протокола
Но если использовать только range
и for-in
, профилировщик времени покажет свидетель протокола.
почему indexingIterator.next()
использует динамический метод, а не School
? Я думал, что даже struct
соответствует protocol
, если переменная в типе struct
использует метод protocol
, этот метод будет статическим методом. Если я ошибаюсь, не могли бы вы сказать мне, что не так?
⬇️School
код
struct SchoolIterator: IteratorProtocol {
private var schoolList: School
var idx = 0
init(_ school: School) {
self.schoolList = school
}
mutating func next() -> String? {
defer { idx += 1 }
guard schoolList.count-1 >= idx
else { return nil }
return schoolList[idx]
}
}
struct School: Sequence {
fileprivate var list = Array(repeating: "school", count: 100000)
var count: Int { return list.count }
subscript(_ idx: Int ) -> String? {
guard idx <= count-1
else { return nil }
return list[idx]
}
func makeIterator() -> SchoolIterator {
return SchoolIterator(self)
}
}
var schools = School()
for school in schools {
print(school)
}
IndexingIterator.next
не отправляется динамически — методы, которые вызываетIndexingIterator.next
, такие какCollection.formIndex
, являются. Вот почему вы не видите свидетеля протокола дляnext
, только дляformIndex
,subscript
и т. д. - person Sweeper   schedule 10.04.2021