CXCompatible 0.0.1-beta.4

CXCompatible 0.0.1-beta.4

luoxiu 维护。



CXCompatible 0.0.1-beta.4

  • Quentin Jin

CXCompatible(中文)

travis release install platform license dicord

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"

相关