Почему я не могу получить доступ к себе в этом конкретном методе, но мне позволено в других? - PullRequest
0 голосов
/ 20 марта 2019

Я видел этот вопрос на SO, но ответы там, кажется, говорят о функциях, которые возвращают self.

Я создаю расширение класса, которое начинается так:

extension Sequence where Element: Comparable {

  func normalize() -> [Element] {
     let count = self.count 

  }

}

Мне нужно получить количество элементов self.count и в последующих строках использовать элементы массива, например self[i], но Свифт жалуется, говоря, что self нет члена с именем count и не позволит мне использовать self в любом контексте.

Как мне это сделать?

1 Ответ

0 голосов
/ 20 марта 2019

В 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 индексы не обязательно являются целыми числами, необходимо использовать функцию index(_:offsetBy:) для создания индекса, который можно передать в методе индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...