#swift
#swift
Вопрос:
Я видел этот вопрос на SO, но ответы там, похоже, говорят о функциях, которые возвращают self
.
Я создаю расширение класса, которое начинается следующим образом
extension Sequence where Element: Comparable {
func normalize() -> [Element] {
let count = self.count
}
}
Мне нужно получить количество элементов self.count
и в последующих строках использовать элементы массива, например, self[i]
но Swift жалуется, говоря, что self
nas ни один член не вызывался count
и не позволит мне использовать self
ни в каком контексте.
Как мне это сделать?
Комментарии:
1.
Sequence
не имеетcount
, вы, вероятно, хотитеCollection
2. Изменено на collection. Self.count работает, но я все еще не могу получить доступ к элементам.
3. @MLL Если вы пытаетесь использовать оператор подстрочного индекса, вам понадобится
RandomAccessCollection
. Хотя было бы лучше переписать ваш код, чтобы в нем не было необходимости. Просто предположение (только из названияnormalize
), но я подозреваю, что вы можете реализовать свою функцию как один вызовSequence.map
, не прибегаяcount
к оператору подстрочного индекса.4. @Alexander к сожалению, в этом случае мне нужно получить доступ к self, потому что это расширение, которое я пытаюсь написать, будет использовать
vDSP
функции ускорения.5. Я думаю, вы неправильно понимаете проблему. С вызовом проблем нет
self
. Существует проблема с доступом к свойствам или вызовом методов, которые не существуют вself
. Обобщение кода путем принятия все более общих типов — это палка о двух концах. Все больше типов становятся совместимыми с вашим кодом, но они выполняют все меньше и меньше. Например,Sequence
это отличное место для реализацииmap
,map
не требует подсчета, случайной индексации, изменчивости коллекции и т.д. Все, что ему нужно, это повторяемость, иSequence
это все о чем-то, что может быть повторено.
Ответ №1:
В swift count
свойство определено не в Sequence
, а в Collection
, поэтому вместо этого вам нужно расширить из Collection
.
extension Collection where Element: Comparable {
func normalize() -> [Element] {
let count = self.count
}
}
Если вам также нужно получить доступ к значению коллекции по индексам ( self[i]
), вы должны RandomAccessCollection
вместо этого расширить, которые предоставляют как count
(поскольку коллекция с произвольным доступом — это коллекция), так и subscript
функцию.
extension RandomAccessCollection where Element: Comparable {
func normalize() -> [Element] {
let count = self.count
let first = self[startIndex]
let second = self[index(startIndex, offsetBy: 1)]
return [first, second]
}
}
Примечание: Поскольку RandomAccessCollection
индексы не обязательно являются int, вы должны использовать index(_:offsetBy:)
функцию для создания индекса, который может быть передан в методе subscript.