XCode 7 Beta 3 — расширение массива

Старая версия кода до XCode 7 Beta 3:

extension Array {
    func filterByIndex<S: SequenceType where S.Generator.Element == Int>(indices: S) -> [T] {
        return Array(PermutationGenerator(elements: self, indices: indices))
    }

    func find(includedElement: T -> Bool) -> Int? {
        for (idx, element) in self.enumerate() {
            if includedElement(element) {
                return idx
            }
        }
        return nil
    }

}

Новая версия кода после XCode 7 Beta 3:

extension Array {
    func filterByIndex<S: SequenceType where S.Generator.Element == Int>(indices: S) -> [Element] {
        return Array(PermutationGenerator(elements: self, indices: indices))
    }

    func find(includedElement: Element -> Bool) -> Int? {
        for (idx, element) in self.enumerate() {
            if includedElement(element) {
                return idx
            }
        }
        return nil
    }
}

Но теперь функция filterByIndex выдает мне ошибку, когда я пишу эту строку:

let names = (namesArr as! [String]).filterByIndex(dupes)

"[String]" не имеет элемента с именем "filterByIndex"

Что изменилось?


person Bogdan Bogdanov    schedule 11.07.2015    source источник
comment
Я согласен с @Arkku, код работает нормально. Я думаю, если бы вы могли привести пример namesArr и dupes, это могло бы помочь сузить проблему (и обязательно указать типы для них).   -  person justinpawela    schedule 11.07.2015


Ответы (1)


Новая версия кода отлично работает для меня с:

[ "zero", "one", "two", "three", "four" ].filterByIndex([1, 3])
// result: [ "one", "three" ]

Я предполагаю, что проблема у вас где-то в другом месте. Сначала я подозревал, что тип dupes (определение которого не показано) не соответствует требованиям универсальной функции, но в моих тестах сообщение об ошибке в этом случае должно быть другим.

person Arkku    schedule 11.07.2015
comment
let dupes = indicesOfUniques(namesArr as! [String]) public func indicesOfUniques<T: Hashable>(source: [T]) -> [Int] { var seen: Set<T> = [] return source.indices.filter { if seen.contains(source[$0]) { return false } else { seen.insert(source[$0]) return true } } } Я изменил T на Element в indexOfUniques и не работает... - person Bogdan Bogdanov; 11.07.2015
comment
@BogdanBogdanov Вы пробовали код из моего ответа? Если это работает для вас, то вопрос неверен, и проблема связана с dupes или namesArr. Чтобы увидеть, какой из них, замените каждый из них созданным вручную массивом по очереди. - person Arkku; 11.07.2015