Swift:使用带有命名空间的泛型方法扩展数组

时间:2017-04-10 13:24:41

标签: generics swift3 swift-extensions

我正在为swift Array类型编写一些扩展方法。

环境是Xcode8.3(8E162)和Swift3.1

我想让最终代码看起来像[1, 2, 3].cc.find { $0 < 2 }这里cc就像RxSwift中的rx和SnapKit中的snp一样。

为实现这一目标,我创建了一个名为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
    }
}

当我构建项目时,编译器将发出错误:

  

'元素'不是'Wrapped'的成员类型

我已经搜索了问题,发现了一个问题Extend array types using where clause in Swift,但问题是关于特定元素类型的扩展数组。

我的代码出了什么问题?我该如何解决?

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方法。

我更改了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 } } 中的代码:

if (!getGradle().getStartParameter().getTaskRequests()
        .toString().contains("Develop")){
    apply plugin: 'com.google.gms.google-services'
}