This repository was archived by the owner on May 10, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 44
Combine Compatible Package
ddddxxx edited this page Oct 15, 2019
·
17 revisions
Some packages allows you to choose underlying Combine implementation (Combine
or CombineX
).
For non Apple platforms, CombineX
is the only choice, A Combine Compatible Package should automatically select CombineX
as the implementation.
On Apple platforms, Combine
is preferred, you can set the env variable SWIFT_PACKAGE_USE_COMBINEX
to use CombineX
.
$ export SWIFT_PACKAGE_USE_COMBINEX="true"
# for command line instruction, execute with env variable
$ swift ...
$ xcodebuild ...
# for Xcode GUI, reopen Xcode with env variable
$ killall Xcode
$ open Package.swift
To create a Combine compatible package, you need to configure your code according to the value of env variable.
CXCompatible does the hard work for you. you can easily write underlayer-unrelated code.
// in your Package.swift
let package = Package(
...
dependencies: [
.package(url: "https://github.com/cx-org/CXCompatible", .branch("master")),
],
targets: [
.target(name: "MyAwesomePackage", dependencies: ["CXShim"]),
]
)
// in your code
import Foundation
import CXShim // Automatically choose `Combine` or `CombineX`
// Avoid name conflict between Foundation.Published and CXShim.Published
typealias Published = CXShim.Published
// Have Fun
Or you can do it yourself.
// in your Package.swift
#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
import Foundation
let useCombineX = ProcessInfo.processInfo.environment["SWIFT_PACKAGE_USE_COMBINEX"] != nil
#else
let useCombineX = true
#endif
if useCombineX {
// Your package config with CombineX
// you should define a compilation condition `USE_COMBINEX` here
let combineSwiftSetting = [SwiftSetting.define("USE_COMBINEX")]
} else {
// Your package config with Combine
}
// in your code
#if USE_COMBINEX
import CombineX
#else
import Combine
#endif