Skip to content
CAI
Software that uses CAICheck a score

CombineCommunity/CombineCocoa

62.8

Adequate · 1 October 2026

1.4k

lines of production code

Swift

with Ruby

2

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

CombineCocoa is a Swift library that bridges UIKit delegate patterns and control events to the Combine reactive programming framework. It provides publishers for standard UI components, gesture recognizers, and Objective-C delegates, allowing developers to handle user interactions without manual delegate implementation. The system supports dependency management via Swift Package Manager and CocoaPods, with build configurations optimized for iOS development.

How it got here

2019 — Migration to Swift Package Manager

6 changes.

The project migrated its dependency management from CocoaPods to Swift Package Manager, updating the library to support SPM and lowering the iOS deployment target to 10.0. The Example app was restructured to use SPM, featuring new gesture recognizer demonstrations and a dedicated unit-test target. Build scripts were also updated to automate Xcode project generation and resolve platform-specific build issues.

2020 — Combine publisher expansion and SPM migration

7 changes.

The project expanded its Combine publisher coverage to include gesture recognizers, text storage, and various UIKit controls, while introducing a new DelegateProxy infrastructure to intercept delegate methods. Concurrently, the codebase was restructured for Swift Package Manager compatibility, restricting support to iOS 13+ and 64-bit architectures, and bridged to Objective-C delegates.

Features

Added ObjcDelegateProxy to bridge Objective-C delegates to Combine

The Sources/Runtime location now includes a new ObjcDelegateProxy implementation (ObjcDelegateProxy.m/h) and a custom modulemap. This component intercepts Objective-C delegate method calls, unpacks their arguments, and forwards them, enabling Objective-C delegate patterns to be observed and consumed via Combine publishers.

Sources/Runtime · high confidence

Expanded Combine publishers for Cocoa controls and gesture recognizers

This update adds new Combine publishers for several UIKit components, allowing you to react to events without delegate methods. New capabilities include gesture recognizers (tap, pinch, rotation, swipe, pan, screen edge pan, and long press), \NSTextStorage\ editing changes, and \UIBarButtonItem\ taps. Existing controls have been updated or added with specific publishers: \UITextField\ now includes \didBeginEditingPublisher\ and \returnPublisher\, \UITextView\ exposes \valuePublisher\ and \textPublisher\, \UISearchBar\ provides text change and button click publishers, and \UIScrollView\ offers detailed scroll state publishers (e.g., \reachedBottomPublisher\, \didScrollPublisher\). Additionally, \UIControl\ now supports a generic \controlEventPublisher\, and existing controls like \UIButton\, \UIDatePicker\, \UIPageControl\, \UIRefreshControl\, \UISegmentedControl\, \UISlider\, \UIStepper\, and \UISwitch\ have been refactored to use the new publisher infrastructure.

Sources/CombineCocoa/Controls · high confidence

Initial framework bundle configuration

Added the Info.plist file for the Sources framework, establishing the bundle metadata including the package type (FMWK), development language (en), and initial versioning (0.0.1).

Sources · high confidence

Introduction of DelegateProxy for Combine-based delegate interception

The library now includes a new \DelegateProxy\ class and supporting types (\DelegateProxyPublisher\, \DelegateProxyType\) that allow developers to intercept Cocoa delegate methods and expose them as Combine publishers. This enables reactive handling of delegate events (such as table view or collection view callbacks) by subscribing to selectors, replacing the need for manual delegate method implementation with Combine's \interceptSelectorPublisher\ API.

Sources/CombineCocoa/DelegateProxy · high confidence

Behavioural changes

Add animated property assignment and restructure CombineCocoa for iOS 13+ and SPM

The library now includes a new \assign(to:on:animation:)\ extension for Combine publishers, allowing users to bind values to UI properties with built-in transitions (flip, fade) or custom animation blocks. Internally, the \CombineCocoa\ module has been restructured for Swift Package Manager compatibility and restricted to iOS 13+ and 64-bit architectures. Existing publishers like \ControlEvent\ and \ControlProperty\ have been moved into the \Combine.Publishers\ namespace, renamed from their previous \CombineControl\ prefixes, and updated to use the modern \@available\ and \canImport\ guards.

Sources/CombineCocoa · high confidence

Automated Xcode project generation and Carthage iOS-only builds

The build scripts now automatically generate the Xcode project from Swift Package Manager and apply specific configurations, including disabling arm64 architectures to resolve lipo fat binary bugs in Xcode 12 and integrating SwiftLint checks. Additionally, the Carthage build process is restricted to the iOS platform to prevent unnecessary builds for other platforms.

scripts · high confidence

CombineCocoa version bumped to 0.2.1

The CombineCocoa framework has been updated to version 0.2.1. This release includes Combine publishers for various UIKit controls, such as UISearchBar and UIControl events, and refactors the build system by replacing the generated modulemap with a custom one to improve Carthage compatibility.

CombineCocoa.xcodeproj · medium confidence

Example app demonstrates gesture recognizers and bar button item interactions

The Example app has been updated to showcase additional CombineCocoa publishers. It now includes a right bar button item that triggers a tap publisher, and the main view supports swipe, long-press, and double-tap gesture recognizers, all of which are wired into the debug console output alongside existing control events.

Example/Example · high confidence

Example project adds unit-test target and updates Xcode project settings

The Example project now includes a dedicated unit-test target (ExampleTests) containing test files for UISearchBar, UIPageControl, UITextView, UIScrollView, UITableView, and UICollectionView. The Xcode project file has been upgraded to object version 51, Swift update check 1150, and indentation/tab width set to 4 spaces. The project structure now references Pods\_Example.framework and Pods\_Example\_ExampleTests.framework, and includes build phases for embedding pods frameworks. A new scheme file has been added to configure build, test, launch, profile, analyze, and archive actions for the Example app and its tests.

Example/Example.xcodeproj · high confidence

Example project migrates from CocoaPods to Swift Package Manager

The Example project has removed its CocoaPods dependency infrastructure, deleting the \Pods/\ directory contents including the \Podfile\, \Podfile.lock\, \Pods.xcodeproj\, and all generated target support files (such as \CombineCocoa\ and \Pods-Example\ configs, umbrella headers, and modulemaps). This change reflects a shift to using Swift Package Manager (SPM) for dependency management in the example application.

Example/Pods · high confidence

Swift Package Manager workspace configuration updated

The Xcode workspace file for the Swift Package Manager has been restructured to reference the package itself ('self:') instead of the previous local project and CocoaPods dependencies. This change aligns the workspace configuration with SPM standards, removing the dependency on the local Xcode project and Pods.

.swiftpm · medium confidence

Test coverage

Added unit tests for Combine delegate wrappers

Added comprehensive test coverage for the Combine delegate wrappers in the ExampleTests target. The new tests verify that publishers for UIScrollView, UICollectionView, UITableView, UISearchBar, UIPageControl, and UITextView correctly emit delegate events to subscribers, including scenarios with multiple subscribers and specific value transformations.

Example/ExampleTests · high confidence

Dependencies

CombineCocoa 0.4.1: iOS 10 support, SPM integration, and CocoaPods 1.9 tooling

This release updates the CombineCocoa library to version 0.4.1, lowering the iOS deployment target from 13.0 to 10.0 to support older devices. It introduces official Swift Package Manager (SPM) support via a new Package.swift that defines a 'Runtime' target, while simultaneously updating the CocoaPods infrastructure to use version 1.9.1 of the tooling (via Gemfile) and reflecting the library's new source file patterns and framework dependencies in the podspec. The Example project's Podfile is also updated to use frameworks and target version 1.10.2 of CocoaPods.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 64 → 63 (-1.4)
  • Rubric changed (rubric-2026.09.11 → rubric-2026.09.18) — scores are not directly comparable.

Lenses

  • Code Health 100 → 100 (+0.0)
  • Architecture 100 → 100 (+0.0)
  • Maturity 49 → 49 (+0.0)
  • Readiness 58 → 54 (-4.3)
  • Security 90 → 94 (+4.1)

Resolved (1)

  • Documentation: no installation or build instructions (README.md)

New (1)

  • Coverage not measured — Swift suite

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

CombineCommunity/CombineCocoa was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 1 October 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 7300c75ff9e072aa7fd0fccefcc88f74aae9bf56 — the exact code this score is about.
  • Scored under rubric-2026.09.18 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-e569280dd5e2.