Swift:使用带有命名空间的泛型方法扩展数组
Swift: Extend Array with generics method with namespace
我正在为 swift Array
类型编写一些扩展方法。
环境为Xcode8.3(8E162)和Swift3.1
我想让最终代码看起来像 [1, 2, 3].cc.find { [=14=] < 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
}
}
当我构建项目时,编译器会报错:
'Element' is not a member type of 'Wrapped'
我用谷歌搜索了这个问题并找到了一个问题 ,但问题是关于为特定元素类型扩展数组。
我的代码有什么问题?我该如何解决?
最后,我找到了解决方法。
我更改了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
}
}
我正在为 swift Array
类型编写一些扩展方法。
环境为Xcode8.3(8E162)和Swift3.1
我想让最终代码看起来像 [1, 2, 3].cc.find { [=14=] < 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
}
}
当我构建项目时,编译器会报错:
'Element' is not a member type of 'Wrapped'
我用谷歌搜索了这个问题并找到了一个问题
我的代码有什么问题?我该如何解决?
最后,我找到了解决方法。
我更改了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
}
}