Swift: расширить массив с помощью метода дженериков с пространством имен

Я пишу некоторые методы расширения для быстрого типа Array.

Среда Xcode8.3(8E162) и Swift3.1.

Я хочу, чтобы окончательный код выглядел как [1, 2, 3].cc.find { $0 < 2 } Здесь cc похож на rx в RxSwift и snp в SnapKit.

Для этого я создал файл с именем Namesapce.swift с кодом:

public struct CCWrapper<Wrapped> {
    public let wrapped: Wrapped
    public init(_ wrapped: Wrapped) {
        self.wrapped = wrapped
    }
}

public protocol CCCompatible {
    associatedtype CompatibleType
    static var cc: CCWrapper<CompatibleType>.Type { get set }
    var cc: CCWrapper<CompatibleType> { get set }
}

extension CCCompatible {
    public static var cc: CCWrapper<Self>.Type {
        get { return CCWrapper<Self>.self }
        set {} // for mutating
    }

    public var cc: CCWrapper<Self> {
        get { return CCWrapper(self) }
        set {} // for mutating
    }
}

Другой файл с именем Array+CC.swift с кодом:

extension Array: CCCompatible {}

extension CCWrapper where Wrapped == Array<Any> {
    public func find(_ predicate: (Wrapped.Element) -> Bool) -> Wrapped.Element? {
        for e in wrapped where predicate(e) { return e }
        return nil
    }
}

Когда я соберу проект, компилятор выдаст ошибку:

«Элемент» не является типом элемента «Обернутый»

Я погуглил проблему и нашел вопрос Расширить типы массивов, используя предложение where в Swift, но вопрос в расширении массива для определенного типа элемента.

Что не так с моим кодом? Как я могу это исправить?


person Cokile Ceoi    schedule 10.04.2017    source источник


Ответы (1)


Наконец, я нашел обходной путь.

Я меняю код в Array+CC.swift:

extension Array: CCCompatible {}

extension CCWrapper where Wrapped: Sequence {
    public func find(_ predicate: (Wrapped.Iterator.Element) -> Bool) -> Wrapped.Iterator.Element? {
        for e in wrapped where predicate(e) { return e }
        return nil
    }
}
person Cokile Ceoi    schedule 11.04.2017
comment
У меня точно такая же проблема . Я попытался изменить свой код с помощью вашего метода, и я получил недостающий аргумент для параметра № 2 в вызове. можете вы помочь мне ? код `мутирующая функция удаления (объект: T.Iterator.Element) { if let index = index(of:object) { remove(at: index) } }` - person Neko; 28.11.2018