Невозможно вызвать 'swapAt' со списком аргументов типа '(Int, Int)' - PullRequest
0 голосов
/ 03 марта 2019

Пожалуйста, примите во внимание следующее:

extension MutableCollection where Self:BidirectionalCollection, Element: Equatable {

    mutating func moveRight(_ value: Element){

        for i in (0..<self.count) {

            if (self[self.index(self.startIndex, offsetBy: i)] == value){
                swapAt(0, 5)
            }
        }
    }
}

Xcode показывает мне ошибку на swapAt(0,5).Зачем?swapAt - это метод, который требует 2 целых числа (индекса), и я предоставляю 2 целочисленных значения.

enter image description here

Ответы [ 2 ]

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

Снимок экрана: swapAt для Array, а не MutableCollection.В отличие от массивов, коллекции могут иметь нецелые числа index (например, String).

Вы можете использовать Self.Index следующим образом:

extension MutableCollection where Self:BidirectionalCollection, Element: Equatable {
    mutating func moveRight(_ value: Element){
        for i in (0..<self.count) {
            if self[index(startIndex, offsetBy: i)] == value {
                swapAt(startIndex, index(startIndex, offsetBy: 5))
            }
        }
    }
}

Или, как предложено вкомментарии Sulthan и Leo Dabus :

extension MutableCollection where Self: BidirectionalCollection, Element: Equatable {
    mutating func moveRight(_ value: Element) {
        for i in indices where self[i] == value {
            swapAt(startIndex, index(startIndex, offsetBy: 5))
        }
    }
}
0 голосов
/ 03 марта 2019

На самом деле нет, MutableCollection.swapAt не определен, чтобы принимать два Int, он определяется в терминах Index из MutableCollection:

swapAt(Self.Index, Self.Index)

ПоэтомуВы не можете просто использовать Int, если не добавите ограничение

Index == Int

к своей декларации, сделав его:

extension MutableCollection where Self: BidirectionalCollection, Element: Equatable, Index == Int {
    mutating func moveRight(_ value: Element){
        for i in (0..<self.count) {
            if (self[self.index(self.startIndex, offsetBy: i)] == value){
                swapAt(0, 5)
            }
        }
    }
}

Если вы не хотите ограничивать себя целочисленными индексами, выследует начинать с замены итерации с 0 ..< count на итерацию по индексам:

for i in indices {
    if (self[i] == value) {
       // do swap
       ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...