Я пишу некоторые методы расширения для быстрого типа 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, но вопрос в расширении массива для определенного типа элемента.
Что не так с моим кодом? Как я могу это исправить?