Почему я не могу получить доступ к self в этом конкретном методе, но разрешен в других?

#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.