中文)
CXCompatible(CXCompatible 为 CombineX 提供兼容性补丁。使用它,您可以编写同时兼容 Combine 和 CombineX 的代码。换句话说,您可以在不修改代码库的情况下,自由地在 Combine 和 CombineX 之间切换依赖关系。
#if USE_COMBINE
import CXFoundation
#else
import CXCompatible
#endif
let task = Timer.cx.publish(every: 1, on: RunLoop.main, in: .default)
.sink { date in
// task
}
Combine
允许多个系统类型支持 Publisher
,例如
let nums = [0, 1, 2].publisher
let task = URLSession.share.dataTaskPublisher(for: endpoint)
为什么需要 CXCompatible
您应该已经了解 CombineX
,这是 Combine 的开源实现。其目的是提供一个与 Combine 完全一致的 API,使您摆脱版本和平台的限制。这听起来不错,对吧?但是实现遇到了一些麻烦。
Combine 直接扩展了一些系统类型,并提供了它们的 pub-sub 接口,例如
let nums = [0, 1, 2].publisher
let task = URLSession.share.dataTaskPublisher(for: endpoint)
CombineX 尝试提供相同的功能,但遗憾的是它不能使用相同的 API,例如
extension Sequence {
// Error: ambiguous use of ...
public var publisher: Publishers.Sequence {
// ...
}
}
extension URLSession {
// Swift doesn't allow you to define the same name again, even in a different framework.
public struct DataTaskPublisher: Publisher {
// ...
}
}
CombineX 的解决方案是 cx
let nums = [1, 2, 3].cx.publisher
let task = URLSession.share.cx.dataTaskPublisher(for: endpoint)
是的,这打破了 CombineX 和 Combine 的一致性。为了使此代码兼容 Combine,CXCompatible 实现了所有 cx
接口的替代实现,但基于 Combine。
安装
Swift Package Manager
dependencies.append(
.package(url: "https://github.com/cx-org/CXCompatible", .branch("master"))
)
CocoaPods
pod 'CXCompatible', :git => 'https://github.com/cx-org/CXCompatible.git', :branch => 'master'
Carthage
github "cx-org/CXCompatible" "master"