diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..876fe7d --- /dev/null +++ b/.gitignore @@ -0,0 +1,40 @@ +## Build generated +build/ +DerivedData/ + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ + +## Other +*.moved-aside +*.xccheckout +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa +*.dSYM.zip +*.dSYM + +# Swift Package Manager +.build/ + +# CocoaPods +We recommend against adding the Pods directory to your .gitignore. However +you should judge for yourself, the pros and cons are mentioned at: +https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +Example/Pods/ + +# Carthage +Carthage + +### Visual Studio Code +.vscode \ No newline at end of file diff --git a/CombineCocoa.podspec b/CombineCocoa.podspec new file mode 100644 index 0000000..6b31ad6 --- /dev/null +++ b/CombineCocoa.podspec @@ -0,0 +1,20 @@ +Pod::Spec.new do |s| + s.name = "CombineCocoa" + s.version = "0.0.1" + s.summary = "CombineCocoa provided basic publisher bridges for UIControls in UIKit" + s.description = <<-DESC + Combine publisher bridges for Cocoa Controls (UIControl) in UIKit + DESC + s.homepage = "https://github.com/freak4pc/CombineCocoa" + s.license = 'MIT' + s.author = { "Shai Mishali" => "freak4pc@gmail.com" } + s.source = { :git => "https://github.com/freak4pc/CombineCocoa.git", :tag => s.version.to_s } + + s.requires_arc = true + + s.ios.deployment_target = '13.0' + + s.source_files = 'Sources/**/*.swift' + s.frameworks = ['Combine'] + s.swift_version = '5.0' + end \ No newline at end of file diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..ce2d65b --- /dev/null +++ b/Example/Example.xcodeproj/project.pbxproj @@ -0,0 +1,385 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 01E12E7E9EA96C5CE61AC0A0 /* libPods-Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 63A13A1E91FDDD8B71881CB0 /* libPods-Example.a */; }; + A233795622F59DBD0083F92F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A233795522F59DBD0083F92F /* Main.storyboard */; }; + A24C43FD22F592E700BC2E2B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24C43FC22F592E700BC2E2B /* AppDelegate.swift */; }; + A24C43FF22F592E700BC2E2B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24C43FE22F592E700BC2E2B /* SceneDelegate.swift */; }; + A24C440122F592E700BC2E2B /* ControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A24C440022F592E700BC2E2B /* ControlsViewController.swift */; }; + A24C440622F592E800BC2E2B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A24C440522F592E800BC2E2B /* Assets.xcassets */; }; + A24C440922F592E800BC2E2B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A24C440722F592E800BC2E2B /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 63A13A1E91FDDD8B71881CB0 /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 927F64FF9C58D68C5DBCE056 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; + A233795522F59DBD0083F92F /* Main.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; + A24C43F922F592E700BC2E2B /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A24C43FC22F592E700BC2E2B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + A24C43FE22F592E700BC2E2B /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + A24C440022F592E700BC2E2B /* ControlsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlsViewController.swift; sourceTree = ""; }; + A24C440522F592E800BC2E2B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + A24C440822F592E800BC2E2B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + A24C440A22F592E800BC2E2B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F49348EECDF8FBFEACF01D5A /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + A24C43F622F592E700BC2E2B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 01E12E7E9EA96C5CE61AC0A0 /* libPods-Example.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5AA492788213BB4C359F55B1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 63A13A1E91FDDD8B71881CB0 /* libPods-Example.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + A24C43F022F592E700BC2E2B = { + isa = PBXGroup; + children = ( + A24C43FB22F592E700BC2E2B /* Example */, + A24C43FA22F592E700BC2E2B /* Products */, + D8BE4EB532AFD7B4CF9F910A /* Pods */, + 5AA492788213BB4C359F55B1 /* Frameworks */, + ); + sourceTree = ""; + }; + A24C43FA22F592E700BC2E2B /* Products */ = { + isa = PBXGroup; + children = ( + A24C43F922F592E700BC2E2B /* Example.app */, + ); + name = Products; + sourceTree = ""; + }; + A24C43FB22F592E700BC2E2B /* Example */ = { + isa = PBXGroup; + children = ( + A24C43FC22F592E700BC2E2B /* AppDelegate.swift */, + A24C43FE22F592E700BC2E2B /* SceneDelegate.swift */, + A24C440022F592E700BC2E2B /* ControlsViewController.swift */, + A24C440522F592E800BC2E2B /* Assets.xcassets */, + A24C440722F592E800BC2E2B /* LaunchScreen.storyboard */, + A24C440A22F592E800BC2E2B /* Info.plist */, + A233795522F59DBD0083F92F /* Main.storyboard */, + ); + path = Example; + sourceTree = ""; + }; + D8BE4EB532AFD7B4CF9F910A /* Pods */ = { + isa = PBXGroup; + children = ( + 927F64FF9C58D68C5DBCE056 /* Pods-Example.debug.xcconfig */, + F49348EECDF8FBFEACF01D5A /* Pods-Example.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + A24C43F822F592E700BC2E2B /* Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = A24C440D22F592E800BC2E2B /* Build configuration list for PBXNativeTarget "Example" */; + buildPhases = ( + 338993AE23C6BA9031AD2866 /* [CP] Check Pods Manifest.lock */, + A24C43F522F592E700BC2E2B /* Sources */, + A24C43F622F592E700BC2E2B /* Frameworks */, + A24C43F722F592E700BC2E2B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Example; + productName = Example; + productReference = A24C43F922F592E700BC2E2B /* Example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A24C43F122F592E700BC2E2B /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + ORGANIZATIONNAME = "Shai Mishali"; + TargetAttributes = { + A24C43F822F592E700BC2E2B = { + CreatedOnToolsVersion = 11.0; + }; + }; + }; + buildConfigurationList = A24C43F422F592E700BC2E2B /* Build configuration list for PBXProject "Example" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = A24C43F022F592E700BC2E2B; + productRefGroup = A24C43FA22F592E700BC2E2B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A24C43F822F592E700BC2E2B /* Example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + A24C43F722F592E700BC2E2B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A233795622F59DBD0083F92F /* Main.storyboard in Resources */, + A24C440922F592E800BC2E2B /* LaunchScreen.storyboard in Resources */, + A24C440622F592E800BC2E2B /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 338993AE23C6BA9031AD2866 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + A24C43F522F592E700BC2E2B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A24C440122F592E700BC2E2B /* ControlsViewController.swift in Sources */, + A24C43FD22F592E700BC2E2B /* AppDelegate.swift in Sources */, + A24C43FF22F592E700BC2E2B /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + A24C440722F592E800BC2E2B /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A24C440822F592E800BC2E2B /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + A24C440B22F592E800BC2E2B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + A24C440C22F592E800BC2E2B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A24C440E22F592E800BC2E2B /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 927F64FF9C58D68C5DBCE056 /* Pods-Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.freak4pc.CombineCocoaExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + A24C440F22F592E800BC2E2B /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = F49348EECDF8FBFEACF01D5A /* Pods-Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = Example/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.freak4pc.CombineCocoaExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + A24C43F422F592E700BC2E2B /* Build configuration list for PBXProject "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A24C440B22F592E800BC2E2B /* Debug */, + A24C440C22F592E800BC2E2B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A24C440D22F592E800BC2E2B /* Build configuration list for PBXNativeTarget "Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A24C440E22F592E800BC2E2B /* Debug */, + A24C440F22F592E800BC2E2B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = A24C43F122F592E700BC2E2B /* Project object */; +} diff --git a/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6d2a51b --- /dev/null +++ b/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/Example.xcworkspace/contents.xcworkspacedata b/Example/Example.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a37cf19 --- /dev/null +++ b/Example/Example.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/Example/AppDelegate.swift b/Example/Example/AppDelegate.swift new file mode 100644 index 0000000..04e22c0 --- /dev/null +++ b/Example/Example/AppDelegate.swift @@ -0,0 +1,17 @@ +// +// AppDelegate.swift +// Example +// +// Created by Shai Mishali on 03/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { + return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) + } +} + diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100755 index 0000000..8d8f4bb --- /dev/null +++ b/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "ItunesArtwork@2x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png new file mode 100644 index 0000000..ce9660f Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000..af1455d Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000..ac12679 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000..708b6a9 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000..7bc992c Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png new file mode 100644 index 0000000..ea99c08 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png new file mode 100644 index 0000000..af1455d Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000..dd99062 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000..3b1d624 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000..3b1d624 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000..ba1430e Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000..d168ec5 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png new file mode 100644 index 0000000..e60fad3 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000..9718897 Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/Example/Example/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/Example/Example/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png new file mode 100644 index 0000000..74f388e Binary files /dev/null and b/Example/Example/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png differ diff --git a/Example/Example/Assets.xcassets/Contents.json b/Example/Example/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Example/Example/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Example/Base.lproj/LaunchScreen.storyboard b/Example/Example/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..865e932 --- /dev/null +++ b/Example/Example/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Example/ControlsViewController.swift b/Example/Example/ControlsViewController.swift new file mode 100644 index 0000000..cd6aea8 --- /dev/null +++ b/Example/Example/ControlsViewController.swift @@ -0,0 +1,42 @@ +// +// ViewController.swift +// Example +// +// Created by Shai Mishali on 03/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import UIKit +import Combine +import CombineCocoa + +class ControlsViewController: UIViewController { + @IBOutlet private var segmented: UISegmentedControl! + @IBOutlet private var slider: UISlider! + @IBOutlet private var textField: UITextField! + @IBOutlet private var button: UIButton! + @IBOutlet private var `switch`: UISwitch! + @IBOutlet private var datePicker: UIDatePicker! + @IBOutlet private var console: UITextView! + + private var subscriptions = Set() + + override func viewDidLoad() { + super.viewDidLoad() + + Just("Debug Output:") + .merge(with: segmented.selectedSegmentIndexPublisher.map { "Segmented at index \($0)" }, + slider.valuePublisher.map { "Slider value is \($0)" }, + textField.textPublisher.map { "Text Field text is \($0 ?? "")" }, + button.tapPublisher.map { "Tapped Button" }, + `switch`.isOnPublisher.map { "Switch is now \($0 ? "On" : "Off")" }, + datePicker.datePublisher.map { "Date picker date is \($0)" }) + .scan("") { $0 + "\n" + $1 } + .handleEvents(receiveOutput: { [console] text in + guard let console = console else { return } + console.scrollRangeToVisible(console.selectedRange) + }) + .assign(to: \.text, on: console) + .store(in: &subscriptions) + } +} diff --git a/Example/Example/Info.plist b/Example/Example/Info.plist new file mode 100644 index 0000000..6b5e7ac --- /dev/null +++ b/Example/Example/Info.plist @@ -0,0 +1,64 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + NSMainNibFile + Main + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Example/Example/Main.storyboard b/Example/Example/Main.storyboard new file mode 100644 index 0000000..36a70c3 --- /dev/null +++ b/Example/Example/Main.storyboard @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Example/SceneDelegate.swift b/Example/Example/SceneDelegate.swift new file mode 100644 index 0000000..0595be6 --- /dev/null +++ b/Example/Example/SceneDelegate.swift @@ -0,0 +1,14 @@ +// +// SceneDelegate.swift +// Example +// +// Created by Shai Mishali on 03/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} + diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..9b84627 --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,5 @@ +platform :ios, '13.0' + +target 'Example' do + pod 'CombineCocoa', :path => '../' +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..3d98ac6 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - CombineCocoa (0.0.1) + +DEPENDENCIES: + - CombineCocoa (from `../`) + +EXTERNAL SOURCES: + CombineCocoa: + :path: "../" + +SPEC CHECKSUMS: + CombineCocoa: 80ba470c40772522242b89dfee8a2eb259519fd0 + +PODFILE CHECKSUM: 85e62659f721771d9a14b592c2e15ea81a0dd919 + +COCOAPODS: 1.7.3 diff --git a/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa-umbrella.h b/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa-umbrella.h new file mode 120000 index 0000000..fb1d44f --- /dev/null +++ b/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa-umbrella.h @@ -0,0 +1 @@ +../../../Target Support Files/CombineCocoa/CombineCocoa-umbrella.h \ No newline at end of file diff --git a/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa.modulemap b/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa.modulemap new file mode 120000 index 0000000..f960835 --- /dev/null +++ b/Example/Pods/Headers/Public/CombineCocoa/CombineCocoa.modulemap @@ -0,0 +1 @@ +../../../Target Support Files/CombineCocoa/CombineCocoa.modulemap \ No newline at end of file diff --git a/Example/Pods/Local Podspecs/CombineCocoa.podspec.json b/Example/Pods/Local Podspecs/CombineCocoa.podspec.json new file mode 100644 index 0000000..2db7019 --- /dev/null +++ b/Example/Pods/Local Podspecs/CombineCocoa.podspec.json @@ -0,0 +1,26 @@ +{ + "name": "CombineCocoa", + "version": "0.0.1", + "summary": "CombineCocoa provided basic publisher bridges for UIControls in UIKit", + "description": "Combine publisher bridges for Cocoa Controls (UIControl) in UIKit", + "homepage": "https://github.com/freak4pc/CombineCocoa", + "license": "MIT", + "authors": { + "Shai Mishali": "freak4pc@gmail.com" + }, + "source": { + "git": "https://github.com/freak4pc/CombineCocoa.git", + "tag": "0.0.1" + }, + "requires_arc": true, + "platforms": { + "ios": "13.0", + "tvos": "13.0" + }, + "source_files": "Sources/**/*.swift", + "frameworks": [ + "Combine" + ], + "swift_versions": "5.0", + "swift_version": "5.0" +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000..3d98ac6 --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,16 @@ +PODS: + - CombineCocoa (0.0.1) + +DEPENDENCIES: + - CombineCocoa (from `../`) + +EXTERNAL SOURCES: + CombineCocoa: + :path: "../" + +SPEC CHECKSUMS: + CombineCocoa: 80ba470c40772522242b89dfee8a2eb259519fd0 + +PODFILE CHECKSUM: 85e62659f721771d9a14b592c2e15ea81a0dd919 + +COCOAPODS: 1.7.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8014e68 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,607 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 057480E8ADCF4362EC9161813D53B7E9 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 156BF54520F2121642B61B54902E7808 /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 11A26BDB4667BBF6CA879B4A157FE7D9 /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5A10118860486B1C21B46B8EC8C08425 /* Pods-Example-dummy.m */; }; + 2C43BC077682B774F6E8F85641F17633 /* UIStepper+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5832B581E95AC16A1CB004E0083F316F /* UIStepper+Combine.swift */; }; + 32C89F08A89B9A69CE290CE4F23DB45C /* UIRefreshControl+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8F630870B6701F31E0320AAA973E4D /* UIRefreshControl+Combine.swift */; }; + 607B18D82A5C24B53559A6ED09CCF0C1 /* UITextField+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4338854C989F0EC975A171A7250C93B4 /* UITextField+Combine.swift */; }; + 7D8EF699218C64ABC01A5D30DC11C7BD /* UISegmentedControl+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A54EF437EC884878352DD1B88B38005 /* UISegmentedControl+Combine.swift */; }; + 9F2F224D66BC1B6E6C73BFEA6D2F351D /* CombineControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 316296437527B1C68F576A9510DDF1F8 /* CombineControlEvent.swift */; }; + A7AA994764BC3DC67E09647B18B8DD8F /* UISwitch+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8995B7951F34FF06B58737C0ACB3769A /* UISwitch+Combine.swift */; }; + AB59ABEC316B4B2C1D79CFBD7C212EA0 /* UISlider+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAEE6C21A49E406BF32975E67ACC08EA /* UISlider+Combine.swift */; }; + AEE4B6F30DAD360435D807C028D97E17 /* UIDatePicker+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B340B87E5DCBD7AE596CB9369AD076D /* UIDatePicker+Combine.swift */; }; + C905F53738A4BDCC72831D74CA64FC1F /* CombineCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 09EA356F2D357BBA449A11858F300B75 /* CombineCocoa-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; }; + CAE25DB4395CD45BA18D6D913ECAEAEC /* CombineControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E2270412BF7DB9A35AAB8A37A1DDA3E /* CombineControlProperty.swift */; }; + D36FB93F68A4107CAFFB956079C36CB8 /* UIButton+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 28A1E8C87097F1C373A6F283AC91E4EA /* UIButton+Combine.swift */; }; + D404D253248AB652E51F7128A844B631 /* UIPageControl+Combine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AD0C382B4A712AD5CD0B23E7E9DC8D8 /* UIPageControl+Combine.swift */; }; + DB62DCDA553BC2609C952FDFED8AAC49 /* CombineCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 966486EB29275F53BD553CC440687CE4 /* CombineCocoa-dummy.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 560FC395D5C29A5B56E6EE7317066EE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1C11E051A417486DA3B63E1333BABA34; + remoteInfo = CombineCocoa; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 09282D515748945C3F4A42454AD10217 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + 09EA356F2D357BBA449A11858F300B75 /* CombineCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CombineCocoa-umbrella.h"; sourceTree = ""; }; + 0E2270412BF7DB9A35AAB8A37A1DDA3E /* CombineControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineControlProperty.swift; path = Sources/CombineControlProperty.swift; sourceTree = ""; }; + 156BF54520F2121642B61B54902E7808 /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = ""; }; + 1F667CC0E19EAF34E5A4119E2121F585 /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-Example.a"; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 28A1E8C87097F1C373A6F283AC91E4EA /* UIButton+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIButton+Combine.swift"; sourceTree = ""; }; + 2F8F630870B6701F31E0320AAA973E4D /* UIRefreshControl+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIRefreshControl+Combine.swift"; sourceTree = ""; }; + 316296437527B1C68F576A9510DDF1F8 /* CombineControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineControlEvent.swift; path = Sources/CombineControlEvent.swift; sourceTree = ""; }; + 3D6746E07DAA8BF046F4230C613B314E /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = ""; }; + 4338854C989F0EC975A171A7250C93B4 /* UITextField+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UITextField+Combine.swift"; sourceTree = ""; }; + 4AD0C382B4A712AD5CD0B23E7E9DC8D8 /* UIPageControl+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIPageControl+Combine.swift"; sourceTree = ""; }; + 4B340B87E5DCBD7AE596CB9369AD076D /* UIDatePicker+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Combine.swift"; sourceTree = ""; }; + 4F31DC3180B6C6F260A31BCF3AFDEB96 /* CombineCocoa.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = CombineCocoa.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 53A341026EB50DB44BD6D7600982D503 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = ""; }; + 5832B581E95AC16A1CB004E0083F316F /* UIStepper+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIStepper+Combine.swift"; sourceTree = ""; }; + 5A10118860486B1C21B46B8EC8C08425 /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = ""; }; + 68AEE0193313FD3751C4CF7E354952DA /* CombineCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CombineCocoa.xcconfig; sourceTree = ""; }; + 763B5F5D6D7214D56B655DE87625A480 /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = ""; }; + 88FAAF37FA8D37D53182695C2E2E07EB /* CombineCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = CombineCocoa.modulemap; sourceTree = ""; }; + 8995B7951F34FF06B58737C0ACB3769A /* UISwitch+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UISwitch+Combine.swift"; sourceTree = ""; }; + 966486EB29275F53BD553CC440687CE4 /* CombineCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CombineCocoa-dummy.m"; sourceTree = ""; }; + 970772B5C56AE8183F2F58567C15A0D1 /* CombineCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CombineCocoa-prefix.pch"; sourceTree = ""; }; + 9A3D778F0C0BA5A11B556A6026C20B46 /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = ""; }; + 9A54EF437EC884878352DD1B88B38005 /* UISegmentedControl+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UISegmentedControl+Combine.swift"; sourceTree = ""; }; + 9A8BC4CE72A41A90356C6098C5A88AF7 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + AAEE6C21A49E406BF32975E67ACC08EA /* UISlider+Combine.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UISlider+Combine.swift"; sourceTree = ""; }; + B13248145D3E19856C33331EC17D9997 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + EAC91070C4196357785C6A157C24782A /* libCombineCocoa.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libCombineCocoa.a; path = libCombineCocoa.a; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 28110CCB28472472FBD697C71FB96851 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 657C8C9B4940FA31E6F65597851A2945 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 001744C72D3E8E14761083E51FC64559 /* CombineCocoa */ = { + isa = PBXGroup; + children = ( + 316296437527B1C68F576A9510DDF1F8 /* CombineControlEvent.swift */, + 0E2270412BF7DB9A35AAB8A37A1DDA3E /* CombineControlProperty.swift */, + 6E4909EC219CE5C6FD54BCE903BF5EDF /* Controls */, + 3B2C95CCAB9E87C1D4425C11DA381D32 /* Pod */, + 90D85271895E4BA8F69231938D40B6D2 /* Support Files */, + ); + name = CombineCocoa; + path = ../..; + sourceTree = ""; + }; + 0755250E88A9FA5D9DE9E312351467B5 /* Products */ = { + isa = PBXGroup; + children = ( + EAC91070C4196357785C6A157C24782A /* libCombineCocoa.a */, + 1F667CC0E19EAF34E5A4119E2121F585 /* libPods-Example.a */, + ); + name = Products; + sourceTree = ""; + }; + 3B2C95CCAB9E87C1D4425C11DA381D32 /* Pod */ = { + isa = PBXGroup; + children = ( + 4F31DC3180B6C6F260A31BCF3AFDEB96 /* CombineCocoa.podspec */, + B13248145D3E19856C33331EC17D9997 /* LICENSE */, + 09282D515748945C3F4A42454AD10217 /* README.md */, + ); + name = Pod; + sourceTree = ""; + }; + 45BF6390E4DB7E143C827E9EE4118525 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + E58C35B79B0E723B7230CF24882E6121 /* Pods-Example */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 6E4909EC219CE5C6FD54BCE903BF5EDF /* Controls */ = { + isa = PBXGroup; + children = ( + 28A1E8C87097F1C373A6F283AC91E4EA /* UIButton+Combine.swift */, + 4B340B87E5DCBD7AE596CB9369AD076D /* UIDatePicker+Combine.swift */, + 4AD0C382B4A712AD5CD0B23E7E9DC8D8 /* UIPageControl+Combine.swift */, + 2F8F630870B6701F31E0320AAA973E4D /* UIRefreshControl+Combine.swift */, + 9A54EF437EC884878352DD1B88B38005 /* UISegmentedControl+Combine.swift */, + AAEE6C21A49E406BF32975E67ACC08EA /* UISlider+Combine.swift */, + 5832B581E95AC16A1CB004E0083F316F /* UIStepper+Combine.swift */, + 8995B7951F34FF06B58737C0ACB3769A /* UISwitch+Combine.swift */, + 4338854C989F0EC975A171A7250C93B4 /* UITextField+Combine.swift */, + ); + name = Controls; + path = Sources/Controls; + sourceTree = ""; + }; + 90747324E64B07383820D667060AE6C4 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 001744C72D3E8E14761083E51FC64559 /* CombineCocoa */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 90D85271895E4BA8F69231938D40B6D2 /* Support Files */ = { + isa = PBXGroup; + children = ( + 88FAAF37FA8D37D53182695C2E2E07EB /* CombineCocoa.modulemap */, + 68AEE0193313FD3751C4CF7E354952DA /* CombineCocoa.xcconfig */, + 966486EB29275F53BD553CC440687CE4 /* CombineCocoa-dummy.m */, + 970772B5C56AE8183F2F58567C15A0D1 /* CombineCocoa-prefix.pch */, + 09EA356F2D357BBA449A11858F300B75 /* CombineCocoa-umbrella.h */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/CombineCocoa"; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 90747324E64B07383820D667060AE6C4 /* Development Pods */, + D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, + 0755250E88A9FA5D9DE9E312351467B5 /* Products */, + 45BF6390E4DB7E143C827E9EE4118525 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; + E58C35B79B0E723B7230CF24882E6121 /* Pods-Example */ = { + isa = PBXGroup; + children = ( + 53A341026EB50DB44BD6D7600982D503 /* Pods-Example.modulemap */, + 763B5F5D6D7214D56B655DE87625A480 /* Pods-Example-acknowledgements.markdown */, + 9A3D778F0C0BA5A11B556A6026C20B46 /* Pods-Example-acknowledgements.plist */, + 5A10118860486B1C21B46B8EC8C08425 /* Pods-Example-dummy.m */, + 156BF54520F2121642B61B54902E7808 /* Pods-Example-umbrella.h */, + 3D6746E07DAA8BF046F4230C613B314E /* Pods-Example.debug.xcconfig */, + 9A8BC4CE72A41A90356C6098C5A88AF7 /* Pods-Example.release.xcconfig */, + ); + name = "Pods-Example"; + path = "Target Support Files/Pods-Example"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 69CF3EBFFB4295D0BD42DFAF2720F27C /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 057480E8ADCF4362EC9161813D53B7E9 /* Pods-Example-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E046EE92ACB10B9D0424DBA97A97E60 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + C905F53738A4BDCC72831D74CA64FC1F /* CombineCocoa-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = ACA3651D45574003DA5D7B798CFF19C8 /* Build configuration list for PBXNativeTarget "Pods-Example" */; + buildPhases = ( + 69CF3EBFFB4295D0BD42DFAF2720F27C /* Headers */, + 3F347A8729053FA7AECE74A4F7DF59C7 /* Sources */, + 657C8C9B4940FA31E6F65597851A2945 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 4F284EE1201264545CEB1EE4097A3B32 /* PBXTargetDependency */, + ); + name = "Pods-Example"; + productName = "Pods-Example"; + productReference = 1F667CC0E19EAF34E5A4119E2121F585 /* libPods-Example.a */; + productType = "com.apple.product-type.library.static"; + }; + 1C11E051A417486DA3B63E1333BABA34 /* CombineCocoa */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1EF1F1A68942723F02EB1C948B4BFFB5 /* Build configuration list for PBXNativeTarget "CombineCocoa" */; + buildPhases = ( + 7E046EE92ACB10B9D0424DBA97A97E60 /* Headers */, + F0B9AD727441FA6ECA40067B5D5C2520 /* Sources */, + 28110CCB28472472FBD697C71FB96851 /* Frameworks */, + 65BF661DF06271A1EFC9B5B0E0EA1222 /* Copy generated compatibility header */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CombineCocoa; + productName = CombineCocoa; + productReference = EAC91070C4196357785C6A157C24782A /* libCombineCocoa.a */; + productType = "com.apple.product-type.library.static"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = 0755250E88A9FA5D9DE9E312351467B5 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1C11E051A417486DA3B63E1333BABA34 /* CombineCocoa */, + 0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 65BF661DF06271A1EFC9B5B0E0EA1222 /* Copy generated compatibility header */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h", + "${PODS_ROOT}/Headers/Public/CombineCocoa/CombineCocoa.modulemap", + "${PODS_ROOT}/Headers/Public/CombineCocoa/CombineCocoa-umbrella.h", + ); + name = "Copy generated compatibility header"; + outputFileListPaths = ( + ); + outputPaths = ( + "${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap", + "${BUILT_PRODUCTS_DIR}/CombineCocoa-umbrella.h", + "${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "COMPATIBILITY_HEADER_PATH=\"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h\"\nMODULE_MAP_PATH=\"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap\"\n\nditto \"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h\" \"${COMPATIBILITY_HEADER_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/CombineCocoa/CombineCocoa.modulemap\" \"${MODULE_MAP_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/CombineCocoa/CombineCocoa-umbrella.h\" \"${BUILT_PRODUCTS_DIR}\"\nprintf \"\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\\"${COMPATIBILITY_HEADER_PATH}\\\"\\n requires objc\\n}\\n\" >> \"${MODULE_MAP_PATH}\"\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3F347A8729053FA7AECE74A4F7DF59C7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 11A26BDB4667BBF6CA879B4A157FE7D9 /* Pods-Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + F0B9AD727441FA6ECA40067B5D5C2520 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + DB62DCDA553BC2609C952FDFED8AAC49 /* CombineCocoa-dummy.m in Sources */, + 9F2F224D66BC1B6E6C73BFEA6D2F351D /* CombineControlEvent.swift in Sources */, + CAE25DB4395CD45BA18D6D913ECAEAEC /* CombineControlProperty.swift in Sources */, + D36FB93F68A4107CAFFB956079C36CB8 /* UIButton+Combine.swift in Sources */, + AEE4B6F30DAD360435D807C028D97E17 /* UIDatePicker+Combine.swift in Sources */, + D404D253248AB652E51F7128A844B631 /* UIPageControl+Combine.swift in Sources */, + 32C89F08A89B9A69CE290CE4F23DB45C /* UIRefreshControl+Combine.swift in Sources */, + 7D8EF699218C64ABC01A5D30DC11C7BD /* UISegmentedControl+Combine.swift in Sources */, + AB59ABEC316B4B2C1D79CFBD7C212EA0 /* UISlider+Combine.swift in Sources */, + 2C43BC077682B774F6E8F85641F17633 /* UIStepper+Combine.swift in Sources */, + A7AA994764BC3DC67E09647B18B8DD8F /* UISwitch+Combine.swift in Sources */, + 607B18D82A5C24B53559A6ED09CCF0C1 /* UITextField+Combine.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 4F284EE1201264545CEB1EE4097A3B32 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = CombineCocoa; + target = 1C11E051A417486DA3B63E1333BABA34 /* CombineCocoa */; + targetProxy = 560FC395D5C29A5B56E6EE7317066EE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 0D9F77915874CC2458D03536AF5A7A7C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 68AEE0193313FD3751C4CF7E354952DA /* CombineCocoa.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/CombineCocoa/CombineCocoa-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MODULEMAP_FILE = Headers/Public/CombineCocoa/CombineCocoa.modulemap; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = CombineCocoa; + PRODUCT_NAME = CombineCocoa; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1422B121EAEAEA11307496903FA623C6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 2F2F5CF98620125291A1025B1B797428 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 68AEE0193313FD3751C4CF7E354952DA /* CombineCocoa.xcconfig */; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + GCC_PREFIX_HEADER = "Target Support Files/CombineCocoa/CombineCocoa-prefix.pch"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MODULEMAP_FILE = Headers/Public/CombineCocoa/CombineCocoa.modulemap; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PRIVATE_HEADERS_FOLDER_PATH = ""; + PRODUCT_MODULE_NAME = CombineCocoa; + PRODUCT_NAME = CombineCocoa; + PUBLIC_HEADERS_FOLDER_PATH = ""; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3B321FA0CE1E83ED878913DF9708C6AC /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9A8BC4CE72A41A90356C6098C5A88AF7 /* Pods-Example.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 3C5F305520915435EA85EF5BA9FB188F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3D6746E07DAA8BF046F4230C613B314E /* Pods-Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ENABLE_OBJC_WEAK = NO; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + ED7888FA6713EABBF66D26A8003AD1CA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1EF1F1A68942723F02EB1C948B4BFFB5 /* Build configuration list for PBXNativeTarget "CombineCocoa" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2F2F5CF98620125291A1025B1B797428 /* Debug */, + 0D9F77915874CC2458D03536AF5A7A7C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + ED7888FA6713EABBF66D26A8003AD1CA /* Debug */, + 1422B121EAEAEA11307496903FA623C6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + ACA3651D45574003DA5D7B798CFF19C8 /* Build configuration list for PBXNativeTarget "Pods-Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3C5F305520915435EA85EF5BA9FB188F /* Debug */, + 3B321FA0CE1E83ED878913DF9708C6AC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-dummy.m b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-dummy.m new file mode 100644 index 0000000..89abe9b --- /dev/null +++ b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_CombineCocoa : NSObject +@end +@implementation PodsDummy_CombineCocoa +@end diff --git a/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-prefix.pch b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-umbrella.h b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-umbrella.h new file mode 100644 index 0000000..58754ef --- /dev/null +++ b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double CombineCocoaVersionNumber; +FOUNDATION_EXPORT const unsigned char CombineCocoaVersionString[]; + diff --git a/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.modulemap b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.modulemap new file mode 100644 index 0000000..11ec289 --- /dev/null +++ b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.modulemap @@ -0,0 +1,6 @@ +module CombineCocoa { + umbrella header "CombineCocoa-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.xcconfig b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.xcconfig new file mode 100644 index 0000000..4ce9c55 --- /dev/null +++ b/Example/Pods/Target Support Files/CombineCocoa/CombineCocoa.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown new file mode 100644 index 0000000..53cc94d --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown @@ -0,0 +1,28 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## CombineCocoa + +MIT License + +Copyright (c) 2019 Shai Mishali + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist new file mode 100644 index 0000000..880bd93 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist @@ -0,0 +1,60 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + MIT License + +Copyright (c) 2019 Shai Mishali + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + License + MIT + Title + CombineCocoa + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m new file mode 100644 index 0000000..6ee3f90 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_Example : NSObject +@end +@implementation PodsDummy_Pods_Example +@end diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h new file mode 100644 index 0000000..ecf498e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig new file mode 100644 index 0000000..4b2b0fa --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa" +OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa/CombineCocoa.modulemap" +OTHER_LDFLAGS = $(inherited) -ObjC -l"CombineCocoa" -framework "Combine" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa/CombineCocoa.modulemap" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa" diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap new file mode 100644 index 0000000..175128e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap @@ -0,0 +1,6 @@ +module Pods_Example { + umbrella header "Pods-Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig new file mode 100644 index 0000000..4b2b0fa --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig @@ -0,0 +1,11 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa" +OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa/CombineCocoa.modulemap" +OTHER_LDFLAGS = $(inherited) -ObjC -l"CombineCocoa" -framework "Combine" +OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa/CombineCocoa.modulemap" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/CombineCocoa" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..04c9bdc --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Shai Mishali + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5a20331 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +archive: + scripts/carthage-archive.sh \ No newline at end of file diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..fa3e36b --- /dev/null +++ b/Package.swift @@ -0,0 +1,20 @@ +// swift-tools-version:5.1 +import PackageDescription + +let package = Package( + name: "CombineCocoa", + platforms: [.iOS(.v13)], + products: [ + .library( + name: "CombineCocoa", + targets: ["CombineCocoa"]), + ], + dependencies: [], + targets: [ + .target( + name: "CombineCocoa", + dependencies: [], + path: "Sources" + ) + ] +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..210ea2c --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# CombineCocoa + +

+ +

+CombineCocoa supports CocoaPods +CombineCocoa supports Swift Package Manager (SPM) +CombineCocoa supports Carthage +
+ +

+ +CombineCocoa attempts to provide publishers for common UIKit controls so you can consume user interaction as Combine emissions and compose them into meaningful, logical publisher chains. + +**Note**: This is still a primal version of this, with much more to be desired. I gladly accept PRs, ideas, opinions, or improvements. Thank you ! :) + +## Basic Examples + +Check out the [Example in the **Example** folder](https://github.com/freak4pc/CombineCocoa/blob/master/Example/Example/ControlsViewController.swift#L27). Run `pod install` and open the workspace to try it out. + +

+ +## Usage + +tl;dr: + +```swift +import Combine +import CombineCocoa + +textField.textPublisher // AnyPublisher +segmented.selectedSegmentIndexPublisher // AnyPublisher +slider.valuePublisher // AnyPublisher +button.tapPublisher // AnyPublisher +swtch.isOnPublisher // AnyPublisher +stepper.valuePublisher // AnyPublisher +datePicker.datePublisher // AnyPublisher +refreshControl.isRefreshingPublisher // AnyPublisher +pageControl.currentPagePublisher // AnyPublisher +``` + +## Installation + +### CocoaPods + +Add the following line to your **Podfile**: + +```rb +pod 'CombineCocoa' +``` + +### Swift Package Manager + +Add the following dependency to your **Package.swift** file: + +```swift +.package(url: "https://github.com/freak4pc/CombineCocoa.git", from: "0.0.1") +``` + +### Carthage + +Carthage support is offered as a prebuilt binary. + +Add the following to your **Cartfile**: + +``` +github "freak4pc/CombineCocoa" +``` + +## Future ideas + +* Support non `UIControl.Event`-based publishers (e.g. delegates). +* ... your ideas? :) + +## Acknowledgments + +* CombineCocoa is highly inspired by RxSwift's [RxCocoa](https://github.com/ReactivXx/RxSwift) in its essence, kudos to [Krunoslav Zaher](https://twitter.com/KrunoslavZaher) for all of his amazing work on this. +* Thanks to [Antoine van der Lee](https://twitter.com/twannl) for his tutorial on [Creating Custom Publishers](https://www.avanderlee.com/swift/custom-combine-publisher/). The idea to set up a control target inside the publisher was inspired by it. + +## License + +MIT, of course ;-) See the [LICENSE](LICENSE) file. + +The Apple logo and the Combine framework are property of Apple Inc. diff --git a/Resources/example.gif b/Resources/example.gif new file mode 100644 index 0000000..b79016b Binary files /dev/null and b/Resources/example.gif differ diff --git a/Resources/logo.png b/Resources/logo.png new file mode 100644 index 0000000..bf00bf1 Binary files /dev/null and b/Resources/logo.png differ diff --git a/Sources/CombineControlEvent.swift b/Sources/CombineControlEvent.swift new file mode 100644 index 0000000..36910a1 --- /dev/null +++ b/Sources/CombineControlEvent.swift @@ -0,0 +1,70 @@ +// +// CombineControlEvent.swift +// CombineCocoa +// +// Created by Shai Mishali on 01/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit.UIControl + +// MARK: - Publisher + +/// A Control Event is a publisher that emits whenever the provided +/// Control Events fire. +public struct CombineControlEvent: Publisher { + public typealias Output = Void + public typealias Failure = Never + + private let control: Control + private let controlEvents: UIControl.Event + + /// Initialize a publisher that emits a Void + /// whenever any of the provided Control Events trigger. + /// + /// - parameter control: UI Control. + /// - parameter events: Control Events. + /// - parameter keyPath: A Key Path from the UI Control to the requested value. + public init(control: Control, + events: UIControl.Event) { + self.control = control + self.controlEvents = events + } + + public func receive(subscriber: S) where S.Failure == Failure, S.Input == Output { + let subscription = Subscription(subscriber: subscriber, + control: control, + event: controlEvents) + + subscriber.receive(subscription: subscription) + } +} + +// MARK: - Subscription +extension CombineControlEvent { + private final class Subscription: Combine.Subscription where S.Input == Void { + private var subscriber: S? + weak private var control: Control? + private var didEmitInitial = false + + init(subscriber: S, control: Control, event: UIControl.Event) { + self.subscriber = subscriber + self.control = control + control.addTarget(self, action: #selector(handleEvent), for: event) + } + + func request(_ demand: Subscribers.Demand) { + // We don't care about the demand at this point. + // As far as we're concerned - UIControl events are endless until the control is deallocated. + } + + func cancel() { + subscriber = nil + } + + @objc private func handleEvent() { + _ = subscriber?.receive() + } + } +} diff --git a/Sources/CombineControlProperty.swift b/Sources/CombineControlProperty.swift new file mode 100644 index 0000000..c4edd95 --- /dev/null +++ b/Sources/CombineControlProperty.swift @@ -0,0 +1,93 @@ +// +// CombineControlProperty.swift +// CombineCocoa +// +// Created by Shai Mishali on 01/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit.UIControl + +// MARK: - Publisher + +/// A Control Property is a publisher that emits the value at the provided keypath +/// whenever the specific control events are triggered. It also emits the keypath's initial value +/// upon subscription. +public struct CombineControlProperty: Publisher { + public typealias Output = Value + public typealias Failure = Never + + private let control: Control + private let controlEvents: UIControl.Event + private let keyPath: KeyPath + + /// Initialize a publisher that emits the value at the specified keypath + /// whenever any of the provided Control Events trigger. + /// + /// - parameter control: UI Control. + /// - parameter events: Control Events. + /// - parameter keyPath: A Key Path from the UI Control to the requested value. + public init(control: Control, + events: UIControl.Event, + keyPath: KeyPath) { + self.control = control + self.controlEvents = events + self.keyPath = keyPath + } + + public func receive(subscriber: S) where S.Failure == Failure, S.Input == Output { + let subscription = Subscription(subscriber: subscriber, + control: control, + event: controlEvents, + keyPath: keyPath) + + subscriber.receive(subscription: subscription) + } +} + +// MARK: - Subscription +extension CombineControlProperty { + private final class Subscription: Combine.Subscription where S.Input == Value { + private var subscriber: S? + weak private var control: Control? + let keyPath: KeyPath + private var didEmitInitial = false + + init(subscriber: S, control: Control, event: UIControl.Event, keyPath: KeyPath) { + self.subscriber = subscriber + self.control = control + self.keyPath = keyPath + control.addTarget(self, action: #selector(handleEvent), for: event) + } + + func request(_ demand: Subscribers.Demand) { + // Emit initial value upon first demand request + if !didEmitInitial, + demand > .none, + let control = control, + let subscriber = subscriber { + _ = subscriber.receive(control[keyPath: keyPath]) + didEmitInitial = true + } + + // We don't care about the demand at this point. + // As far as we're concerned - UIControl events are endless until the control is deallocated. + } + + func cancel() { + subscriber = nil + } + + @objc private func handleEvent() { + guard let control = control else { return } + _ = subscriber?.receive(control[keyPath: keyPath]) + } + } +} + +extension UIControl.Event { + static var defaultValueEvents: UIControl.Event { + return [.allEditingEvents, .valueChanged] + } +} diff --git a/Sources/Controls/UIButton+Combine.swift b/Sources/Controls/UIButton+Combine.swift new file mode 100644 index 0000000..db16276 --- /dev/null +++ b/Sources/Controls/UIButton+Combine.swift @@ -0,0 +1,18 @@ +// +// UIButton+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UIButton { + /// A publisher emitting tap events from this button. + var tapPublisher: AnyPublisher { + CombineControlEvent(control: self, events: .touchUpInside) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UIDatePicker+Combine.swift b/Sources/Controls/UIDatePicker+Combine.swift new file mode 100644 index 0000000..3e66eb8 --- /dev/null +++ b/Sources/Controls/UIDatePicker+Combine.swift @@ -0,0 +1,24 @@ +// +// UIDatePicker+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UIDatePicker { + /// A publisher emitting date changes from this date picker. + var datePublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.date) + .eraseToAnyPublisher() + } + + /// A publisher emitting count down duration changes from this date picker. + var countDownDurationPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.countDownDuration) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UIPageControl+Combine.swift b/Sources/Controls/UIPageControl+Combine.swift new file mode 100644 index 0000000..1be676c --- /dev/null +++ b/Sources/Controls/UIPageControl+Combine.swift @@ -0,0 +1,18 @@ +// +// UIPageControl+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UIPageControl { + /// A publisher emitting current page changes for this page control. + var currentPagePublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.currentPage) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UIRefreshControl+Combine.swift b/Sources/Controls/UIRefreshControl+Combine.swift new file mode 100644 index 0000000..051c4e8 --- /dev/null +++ b/Sources/Controls/UIRefreshControl+Combine.swift @@ -0,0 +1,18 @@ +// +// UIRefreshControl+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UIRefreshControl { + /// A publisher emitting refresh status changes from this refresh control. + var isRefreshingPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.isRefreshing) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UISegmentedControl+Combine.swift b/Sources/Controls/UISegmentedControl+Combine.swift new file mode 100644 index 0000000..2cb8dc3 --- /dev/null +++ b/Sources/Controls/UISegmentedControl+Combine.swift @@ -0,0 +1,18 @@ +// +// UISegmentedControl+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UISegmentedControl { + /// A publisher emitting selected segment index changes for this segmented control. + var selectedSegmentIndexPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.selectedSegmentIndex) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UISlider+Combine.swift b/Sources/Controls/UISlider+Combine.swift new file mode 100644 index 0000000..10717c0 --- /dev/null +++ b/Sources/Controls/UISlider+Combine.swift @@ -0,0 +1,18 @@ +// +// UISlider+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UISlider { + /// A publisher emitting value changes for this slider. + var valuePublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.value) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UIStepper+Combine.swift b/Sources/Controls/UIStepper+Combine.swift new file mode 100644 index 0000000..afabbff --- /dev/null +++ b/Sources/Controls/UIStepper+Combine.swift @@ -0,0 +1,18 @@ +// +// UIStepper+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UIStepper { + /// A publisher emitting value changes for this stepper. + var valuePublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.value) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UISwitch+Combine.swift b/Sources/Controls/UISwitch+Combine.swift new file mode 100644 index 0000000..feefcb7 --- /dev/null +++ b/Sources/Controls/UISwitch+Combine.swift @@ -0,0 +1,18 @@ +// +// UISwitch+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UISwitch { + /// A publisher emitting on status changes for this switch. + var isOnPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.isOn) + .eraseToAnyPublisher() + } +} diff --git a/Sources/Controls/UITextField+Combine.swift b/Sources/Controls/UITextField+Combine.swift new file mode 100644 index 0000000..c4b6a5b --- /dev/null +++ b/Sources/Controls/UITextField+Combine.swift @@ -0,0 +1,30 @@ +// +// UITextField+Combine.swift +// CombineCocoa +// +// Created by Shai Mishali on 02/08/2019. +// Copyright © 2019 Shai Mishali. All rights reserved. +// + +import Combine +import UIKit + +public extension UITextField { + /// A publisher emitting any text changes to a this text field. + var textPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.text) + .eraseToAnyPublisher() + } + + /// A publisher emitting any attributed text changes to this text field. + var attributedTextPublisher: AnyPublisher { + CombineControlProperty(control: self, events: .defaultValueEvents, keyPath: \.attributedText) + .eraseToAnyPublisher() + } + + /// A publisher that emits whenever the user taps the return button and ends the editing on the text field. + var returnPublisher: AnyPublisher { + CombineControlEvent(control: self, events: .editingDidEndOnExit) + .eraseToAnyPublisher() + } +} diff --git a/scripts/carthage-archive.sh b/scripts/carthage-archive.sh new file mode 100755 index 0000000..b6ea654 --- /dev/null +++ b/scripts/carthage-archive.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +if ! which carthage > /dev/null; then + echo 'Error: Carthage is not installed' >&2 + exit 1 +fi + +if [ ! -f Package.swift ]; then + echo "Package.swift can't be found, please make sure you run scripts/carthage-archive.sh from the root folder" >&2 + exit 1 +fi + +if ! which swift > /dev/null; then + echo 'Swift is not installed' >&2 + exit 1 +fi + +REQUIRED_SWIFT_TOOLING="5.1.0" +TOOLS_VERSION=`swift package tools-version` + +if [ ! "$(printf '%s\n' "$REQUIRED_SWIFT_TOOLING" "$TOOLS_VERSION" | sort -V | head -n1)" = "$REQUIRED_SWIFT_TOOLING" ]; then + echo 'You must have Swift Package Manager 5.1.0 or later.' + exit 1 +fi + +swift package generate-xcodeproj +carthage build --no-skip-current +carthage archive + +echo "Upload CombineCocoa.framework.zip to the latest release" \ No newline at end of file