├── .gitignore ├── .gitmodules ├── .swiftlint.yml ├── .travis.yml ├── CONTRIBUTING.md ├── Cartfile ├── Cartfile.private ├── Cartfile.resolved ├── LICENSE.md ├── README.md ├── ReactiveObjCBridge.podspec ├── ReactiveObjCBridge.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ ├── ReactiveObjCBridge-iOS.xcscheme │ ├── ReactiveObjCBridge-macOS.xcscheme │ ├── ReactiveObjCBridge-tvOS.xcscheme │ └── ReactiveObjCBridge-watchOS.xcscheme ├── ReactiveObjCBridge.xcworkspace └── contents.xcworkspacedata ├── ReactiveObjCBridge ├── Info.plist ├── ObjectiveCBridging.swift ├── RACScheduler+SwiftSupport.h ├── RACScheduler+SwiftSupport.m ├── ReactiveObjCBridge.h └── module.modulemap ├── ReactiveObjCBridgeTests ├── Info.plist ├── ObjectiveCBridgingSpec.swift └── TestError.swift └── script ├── build └── update-version /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/* 4 | .vscode/* 5 | *.pbxuser 6 | !default.pbxuser 7 | *.mode1v3 8 | !default.mode1v3 9 | *.mode2v3 10 | !default.mode2v3 11 | *.perspectivev3 12 | !default.perspectivev3 13 | *.xcworkspace 14 | !default.xcworkspace 15 | xcuserdata 16 | profile 17 | *.moved-aside 18 | PlaygroundUtility.remap 19 | 20 | # SwiftPM 21 | .build 22 | 23 | # Carthage 24 | Carthage/Build 25 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Carthage/Checkouts/Nimble"] 2 | path = Carthage/Checkouts/Nimble 3 | url = https://github.com/Quick/Nimble.git 4 | [submodule "Carthage/Checkouts/Quick"] 5 | path = Carthage/Checkouts/Quick 6 | url = https://github.com/Quick/Quick.git 7 | [submodule "Carthage/Checkouts/xcconfigs"] 8 | path = Carthage/Checkouts/xcconfigs 9 | url = https://github.com/jspahrsummers/xcconfigs.git 10 | [submodule "Carthage/Checkouts/Result"] 11 | path = Carthage/Checkouts/Result 12 | url = https://github.com/antitypical/Result.git 13 | [submodule "Carthage/Checkouts/ReactiveSwift"] 14 | path = Carthage/Checkouts/ReactiveSwift 15 | url = https://github.com/ReactiveCocoa/ReactiveSwift.git 16 | [submodule "Carthage/Checkouts/ReactiveObjC"] 17 | path = Carthage/Checkouts/ReactiveObjC 18 | url = https://github.com/ReactiveCocoa/ReactiveObjC.git 19 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - large_tuple 3 | excluded: 4 | - Carthage 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode10.2 3 | before_install: true 4 | install: true 5 | branches: 6 | only: 7 | - master 8 | script: 9 | - script/build 10 | xcode_workspace: ReactiveObjCBridge.xcworkspace 11 | matrix: 12 | include: 13 | - xcode_scheme: ReactiveObjCBridge-macOS 14 | env: 15 | - XCODE_SDK=macosx 16 | - XCODE_ACTION="build test" 17 | - XCODE_DESTINATION="arch=x86_64" 18 | - xcode_scheme: ReactiveObjCBridge-iOS 19 | env: 20 | - XCODE_SDK=iphonesimulator 21 | - XCODE_ACTION="build-for-testing test-without-building" 22 | - XCODE_DESTINATION="platform=iOS Simulator,name=iPhone 6s" 23 | - xcode_scheme: ReactiveObjCBridge-tvOS 24 | env: 25 | - XCODE_SDK=appletvsimulator 26 | - XCODE_ACTION="build-for-testing test-without-building" 27 | - XCODE_DESTINATION="platform=tvOS Simulator,name=Apple TV" 28 | - xcode_scheme: ReactiveObjCBridge-watchOS 29 | env: 30 | - XCODE_SDK=watchsimulator 31 | - XCODE_ACTION=build 32 | - XCODE_DESTINATION="platform=watchOS Simulator,name=Apple Watch - 38mm" 33 | - script: 34 | - carthage build --no-skip-current --platform mac 35 | env: 36 | - JOB=CARTHAGE-macOS 37 | - script: 38 | - carthage build --no-skip-current --platform iOS 39 | env: 40 | - JOB=CARTHAGE-iOS 41 | - script: 42 | - carthage build --no-skip-current --platform tvOS 43 | env: 44 | - JOB=CARTHAGE-tvOS 45 | - script: 46 | - carthage build --no-skip-current --platform watchOS 47 | env: 48 | - JOB=CARTHAGE-watchOS 49 | - install: 50 | - gem update cocoapods 51 | script: 52 | - pod repo update --verbose 53 | - pod lib lint --allow-warnings 54 | env: 55 | - JOB=PODSPEC 56 | notifications: 57 | email: false 58 | slack: 59 | secure: C9QTry5wUG9CfeH3rm3Z19R5rDWqDO7EhHAqHDXBxT6CpGRkTPFliJexpjBYB4sroJ8CiY5ZgTI2sjRBiAdGoE5ZQkfnwSoKQhWXkwo19TnbSnufr3cKO2SZkUhBqOlZcA+mgfjZ7rm2wm7RhpCR/4z8oBXDN4/xv0U5R2fLCLE= 60 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We love that you're interested in contributing to this project! 2 | 3 | To make the process as painless as possible, we have just a couple of guidelines 4 | that should make life easier for everyone involved. 5 | 6 | ## Prefer Pull Requests 7 | 8 | If you know exactly how to implement the feature being suggested or fix the bug 9 | being reported, please open a pull request instead of an issue. Pull requests are easier than 10 | patches or inline code blocks for discussing and merging the changes. 11 | 12 | If you can't make the change yourself, please open an issue after making sure 13 | that one isn't already logged. We are also happy to help you in our Slack room (ping [@ReactiveCocoa](https://twitter.com/ReactiveCocoa) for an invitation). 14 | 15 | ## Contributing Code 16 | 17 | Fork this repository, make it awesomer (preferably in a branch named for the 18 | topic), send a pull request! 19 | 20 | All code contributions should match our coding conventions ([Objective-c](https://github.com/github/objective-c-conventions) and [Swift](https://github.com/github/swift-style-guide)). If your particular case is not described in the coding convention, check the ReactiveCocoa codebase. 21 | 22 | Thanks for contributing! :boom::camel: 23 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveCocoa/ReactiveObjC" ~> 3.1.1 2 | github "ReactiveCocoa/ReactiveSwift" ~> 6.1 3 | -------------------------------------------------------------------------------- /Cartfile.private: -------------------------------------------------------------------------------- 1 | github "jspahrsummers/xcconfigs" "d0f8992afad45262cfe3a3cf512e7127fdcf296c" 2 | github "Quick/Quick" ~> 2.0 3 | github "Quick/Nimble" ~> 8.0.0 4 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "Quick/Nimble" "v8.0.2" 2 | github "Quick/Quick" "v2.1.0" 3 | github "ReactiveCocoa/ReactiveObjC" "3.1.1" 4 | github "ReactiveCocoa/ReactiveSwift" "6.1.0" 5 | github "jspahrsummers/xcconfigs" "d0f8992afad45262cfe3a3cf512e7127fdcf296c" 6 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | **Copyright (c) 2012 - 2016, GitHub, Inc.** 2 | **All rights reserved.** 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of 5 | this software and associated documentation files (the "Software"), to deal in 6 | the Software without restriction, including without limitation the rights to 7 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 8 | the Software, and to permit persons to whom the Software is furnished to do so, 9 | subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in all 12 | copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 16 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 17 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 18 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 19 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ReactiveObjCBridge 2 | 3 | After the announcement of Swift, ReactiveCocoa was rewritten in Swift. This framework 4 | creates a bridge between those Swift and Objective-C APIs (now known as [ReactiveSwift][] 5 | and [ReactiveObjC][] respectively). 6 | 7 | Because the APIs are based on fundamentally different designs, the conversion is 8 | not always one-to-one; however, every attempt has been made to faithfully 9 | translate the concepts between the two APIs (and languages). 10 | 11 | The bridged types include: 12 | 13 | 1. [`RACSignal` and `SignalProducer` or `Signal`](#racsignal-and-signalproducer-or-signal) 14 | 1. [`RACCommand` and `Action`](#raccommand-and-action) 15 | 1. [`RACScheduler` and `SchedulerType`](#racscheduler-and-schedulertype) 16 | 1. [`RACDisposable` and `Disposable`](#racdisposable-and-disposable) 17 | 18 | For the complete bridging API, including documentation, see [`ObjectiveCBridging.swift`][ObjectiveCBridging]. 19 | 20 | ## `RACSignal` and `SignalProducer` or `Signal` 21 | 22 | In ReactiveSwift, “cold” signals are represented by the `SignalProducer` type, 23 | and “hot” signals are represented by the `Signal` type. 24 | 25 | “Cold” `RACSignal`s can be converted into `SignalProducer`s using the 26 | `SignalProducer` initializer: 27 | 28 | ```swift 29 | extension SignalProducer where Error == Swift.Error { 30 | public init(_ signal: RACSignal) where Value == SignalValue? 31 | } 32 | ``` 33 | 34 | “Hot” `RACSignal`s cannot be directly converted into `Signal`s, because _any_ 35 | `RACSignal` subscription could potentially involve side effects. To obtain a 36 | `Signal`, use `RACSignal.toSignalProducer` followed by `SignalProducer.start`, 37 | which will make those potential side effects explicit. 38 | 39 | For the other direction, use the `bridged` property. 40 | 41 | When invoked on a `SignalProducer`, these functions will create a `RACSignal` to 42 | `start()` the producer once for each subscription: 43 | 44 | ```swift 45 | extension SignalProducerProtocol where Value: AnyObject { 46 | public var bridged: RACSignal 47 | } 48 | 49 | extension SignalProducerProtocol where Value: OptionalProtocol, Value.Wrapped: AnyObject { 50 | public var bridged: RACSignal 51 | } 52 | 53 | ``` 54 | 55 | When invoked on a `Signal`, these methods will create a `RACSignal` that simply 56 | observes it: 57 | 58 | ```swift 59 | extension SignalProtocol where Value: AnyObject { 60 | public var bridged: RACSignal { 61 | } 62 | 63 | extension SignalProtocol where Value: OptionalProtocol, Value.Wrapped: AnyObject { 64 | public var bridged: RACSignal { 65 | } 66 | ``` 67 | 68 | `RACSignal`s of numbered tuples can be bridged to `SignalProducer`s of Swift 69 | tuples with a special initializer, `init(bridging:)`: 70 | 71 | ```swift 72 | extension SignalProducer where Error == Swift.Error { 73 | public init(bridging tupleSignal: RACSignal>) where Value == First? 74 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?)? 75 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?)? 76 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?, Fourth?)? 77 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?, Fourth?, Fifth?)? 78 | } 79 | ``` 80 | 81 | ## `RACCommand` and `Action` 82 | 83 | To convert `RACCommand`s into the new `Action` type, use the `Action` initializer: 84 | 85 | ```swift 86 | extension Action where Error == Swift.Error { 87 | public convenience init( 88 | _ command: RACCommand 89 | ) where Input == CommandInput?, Output == CommandOutput? 90 | } 91 | ``` 92 | 93 | To convert `Action`s into `RACCommand`s, use the `bridged` instance 94 | method: 95 | 96 | ```swift 97 | extension Action where Input: AnyObject, Output: AnyObject { 98 | public var bridged: RACCommand 99 | } 100 | 101 | extension Action where Input: OptionalProtocol, Input.Wrapped: AnyObject, Output: AnyObject { 102 | public var bridged: RACCommand 103 | } 104 | 105 | extension Action where Input: AnyObject, Output: OptionalProtocol, Output.Wrapped: AnyObject { 106 | public var bridged: RACCommand 107 | } 108 | 109 | extension Action where Input: OptionalProtocol, Input.Wrapped: AnyObject, Output: OptionalProtocol, Output.Wrapped: AnyObject { 110 | public var bridged: RACCommand 111 | } 112 | ``` 113 | 114 | **NOTE:** The `executing` properties of actions and commands are not 115 | synchronized across the API bridge. To ensure consistency, only observe the 116 | `executing` property from the base object (the one passed _into_ the bridge, not 117 | retrieved from it), so updates occur no matter which object is used for 118 | execution. 119 | 120 | ## `RACScheduler` and `SchedulerType` 121 | 122 | Any `RACScheduler` instance is automatically a `DateSchedulerType` (and 123 | therefore a `SchedulerType`), and can be passed directly into any function or 124 | method that expects one. 125 | 126 | All `Scheduler`s and `DateScheduler`s can be wrapped as a `RACScheduler` using the `RACScheduler` initializer: 127 | 128 | ```swift 129 | extension RACScheduler { 130 | public convenience init(_ scheduler: Scheduler) 131 | public convenience init(_ scheduler: DateScheduler) 132 | } 133 | ``` 134 | 135 | Note that wrapped `Scheduler`s would behave like `RACImmediateScheduler` when deferred 136 | scheduling methods are used. 137 | 138 | ## `RACDisposable` and `Disposable` 139 | 140 | Any `RACDisposable` instance is automatically a `Disposable`, and can be used 141 | directly anywhere a type conforming to `Disposable` is expected. 142 | 143 | Use the `RACDisposable` initializer to wrap an instance of `Disposable`: 144 | 145 | ```swift 146 | extension RACDisposable { 147 | public convenience init(_ disposable: Disposable?) 148 | } 149 | ``` 150 | 151 | ## Numbered `RACTuple`s 152 | 153 | Numbered (and typed) `RACTuple` subtypes, such as `RACOneTuple`, `RACTwoTuple` 154 | etc., can be bridged to native Swift tuples with a series of global functions: 155 | 156 | ```swift 157 | public func bridgedTuple(from tuple: RACOneTuple) -> (First?) 158 | public func bridgedTuple(from tuple: RACTwoTuple) -> (First?, Second?) 159 | public func bridgedTuple(from tuple: RACThreeTuple) -> (First?, Second?, Third?) 160 | public func bridgedTuple(from tuple: RACFourTuple) -> (First?, Second?, Third?, Fourth?) 161 | public func bridgedTuple(from tuple: RACFiveTuple) -> (First?, Second?, Third?, Fourth?, Fifth?) 162 | ``` 163 | 164 | [ReactiveSwift]: https://github.com/ReactiveCocoa/ReactiveSwift/ 165 | [ReactiveObjC]: https://github.com/ReactiveCocoa/ReactiveObjC/ 166 | [ObjectiveCBridging]: ReactiveObjCBridge/ObjectiveCBridging.swift 167 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "ReactiveObjCBridge" 3 | s.version = "6.0.0" 4 | s.summary = "Bridge between ReactiveObjC and ReactiveSwift" 5 | s.description = <<-DESC 6 | After the announcement of Swift, ReactiveCocoa was rewritten in Swift. This framework creates a bridge between those Swift and Objective-C APIs (now known as ReactiveSwift and ReactiveObjC respectively). 7 | 8 | Because the APIs are based on fundamentally different designs, the conversion is not always one-to-one; however, every attempt has been made to faithfully translate the concepts between the two APIs (and languages). 9 | DESC 10 | s.homepage = "https://github.com/ReactiveCocoa/ReactiveObjCBridge" 11 | s.license = { :type => "MIT", :file => "LICENSE.md" } 12 | s.author = "ReactiveCocoa" 13 | 14 | s.osx.deployment_target = "10.9" 15 | s.ios.deployment_target = "8.0" 16 | s.tvos.deployment_target = "9.0" 17 | s.watchos.deployment_target = "2.0" 18 | 19 | s.source = { :git => "https://github.com/ReactiveCocoa/ReactiveObjCBridge.git", :tag => "#{s.version}" } 20 | s.source_files = "ReactiveObjCBridge/*.{swift,h,m}" 21 | s.private_header_files = 'ReactiveObjCBridge/RACScheduler+SwiftSupport.h' 22 | s.module_map = 'ReactiveObjCBridge/module.modulemap' 23 | 24 | s.dependency 'ReactiveObjC', '~> 3.1' 25 | s.dependency 'ReactiveSwift', '~> 6.1' 26 | 27 | s.pod_target_xcconfig = { "OTHER_SWIFT_FLAGS[config=Release]" => "$(inherited) -suppress-warnings" } 28 | 29 | s.cocoapods_version = ">= 1.6.0" 30 | s.swift_versions = ["5.0", "5.1"] 31 | end 32 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 57A4D1B71BA13D7A00F7D4B1 /* ObjectiveCBridging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */; }; 11 | 57A4D20A1BA13D7A00F7D4B1 /* ReactiveObjCBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 7DFBED081CDB8C9500EE435B /* ReactiveObjCBridge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57A4D2411BA13D7A00F7D4B1 /* ReactiveObjCBridge.framework */; }; 13 | 7DFBED1E1CDB8D7000EE435B /* ReactiveObjCBridge.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 57A4D2411BA13D7A00F7D4B1 /* ReactiveObjCBridge.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 14 | 7DFBED1F1CDB8D7800EE435B /* Quick.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 15 | 7DFBED201CDB8D7D00EE435B /* Nimble.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D05E662419EDD82000904ACA /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 16 | 7DFBED271CDB8DE300EE435B /* ObjectiveCBridgingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A226101A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift */; }; 17 | 9AB5CD651EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */; settings = {ATTRIBUTES = (Private, ); }; }; 18 | 9AB5CD661EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */; settings = {ATTRIBUTES = (Private, ); }; }; 19 | 9AB5CD671EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */; settings = {ATTRIBUTES = (Private, ); }; }; 20 | 9AB5CD681EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */; settings = {ATTRIBUTES = (Private, ); }; }; 21 | 9AB5CD691EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */; }; 22 | 9AB5CD6A1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */; }; 23 | 9AB5CD6B1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */; }; 24 | 9AB5CD6C1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */; }; 25 | A9B315BF1B3940810001CB9C /* ObjectiveCBridging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */; }; 26 | A9B315CA1B3940AB0001CB9C /* ReactiveObjCBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 27 | BE330A0F1D634F1E00806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A0E1D634F1E00806963 /* ReactiveSwift.framework */; }; 28 | BE330A111D634F2900806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A101D634F2900806963 /* ReactiveSwift.framework */; }; 29 | BE330A131D634F2E00806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A121D634F2E00806963 /* ReactiveSwift.framework */; }; 30 | BE330A151D634F4000806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A141D634F4000806963 /* ReactiveSwift.framework */; }; 31 | BE330A171D634F4E00806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A161D634F4E00806963 /* ReactiveSwift.framework */; }; 32 | BE330A191D634F5900806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A181D634F5900806963 /* ReactiveSwift.framework */; }; 33 | BE330A1B1D634F5F00806963 /* ReactiveSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BE330A1A1D634F5F00806963 /* ReactiveSwift.framework */; }; 34 | BEA5E5D91D864DC900A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5D81D864DC900A1F0F2 /* ReactiveObjC.framework */; }; 35 | BEA5E5DB1D864DD100A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5DA1D864DD100A1F0F2 /* ReactiveObjC.framework */; }; 36 | BEA5E5DD1D864DD800A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5DC1D864DD800A1F0F2 /* ReactiveObjC.framework */; }; 37 | BEA5E5DF1D864DDE00A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5DE1D864DDE00A1F0F2 /* ReactiveObjC.framework */; }; 38 | BEA5E5E11D864DE800A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5E01D864DE800A1F0F2 /* ReactiveObjC.framework */; }; 39 | BEA5E5E31D864DED00A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5E21D864DED00A1F0F2 /* ReactiveObjC.framework */; }; 40 | BEA5E5E51D864DF400A1F0F2 /* ReactiveObjC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BEA5E5E41D864DF400A1F0F2 /* ReactiveObjC.framework */; }; 41 | BEA5E5E81D864E7600A1F0F2 /* TestError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEA5E5E61D864E7200A1F0F2 /* TestError.swift */; }; 42 | BEA5E5E91D864E7700A1F0F2 /* TestError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEA5E5E61D864E7200A1F0F2 /* TestError.swift */; }; 43 | BEA5E5EA1D864E7900A1F0F2 /* TestError.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEA5E5E61D864E7200A1F0F2 /* TestError.swift */; }; 44 | CDF066CA1CDC1CA200199626 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05E662419EDD82000904ACA /* Nimble.framework */; }; 45 | CDF066CB1CDC1CA200199626 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; }; 46 | D01B7B6219EDD8FE00D26E01 /* Nimble.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D05E662419EDD82000904ACA /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 47 | D01B7B6319EDD8FE00D26E01 /* Quick.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 48 | D01B7B6419EDD94B00D26E01 /* ReactiveObjCBridge.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = D047260C19E49F82006002AA /* ReactiveObjCBridge.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 49 | D037666419EDA43C00A782A9 /* ReactiveObjCBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50 | D037672D19EDA75D00A782A9 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; }; 51 | D037672F19EDA78B00A782A9 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D037672B19EDA75D00A782A9 /* Quick.framework */; }; 52 | D04725F019E49ED7006002AA /* ReactiveObjCBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53 | D04725F619E49ED7006002AA /* ReactiveObjCBridge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D04725EA19E49ED7006002AA /* ReactiveObjCBridge.framework */; }; 54 | D047261719E49F82006002AA /* ReactiveObjCBridge.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D047260C19E49F82006002AA /* ReactiveObjCBridge.framework */; }; 55 | D05E662519EDD82000904ACA /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05E662419EDD82000904ACA /* Nimble.framework */; }; 56 | D05E662619EDD83000904ACA /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D05E662419EDD82000904ACA /* Nimble.framework */; }; 57 | D0A226111A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A226101A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift */; }; 58 | D0A226121A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0A226101A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift */; }; 59 | D0C312DF19EF2A5800984962 /* ObjectiveCBridging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */; }; 60 | D0C312E019EF2A5800984962 /* ObjectiveCBridging.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */; }; 61 | /* End PBXBuildFile section */ 62 | 63 | /* Begin PBXContainerItemProxy section */ 64 | 7DFBED091CDB8C9500EE435B /* PBXContainerItemProxy */ = { 65 | isa = PBXContainerItemProxy; 66 | containerPortal = D04725E119E49ED7006002AA /* Project object */; 67 | proxyType = 1; 68 | remoteGlobalIDString = 57A4D1AF1BA13D7A00F7D4B1; 69 | remoteInfo = "ReactiveCocoa-tvOS"; 70 | }; 71 | D04725F719E49ED7006002AA /* PBXContainerItemProxy */ = { 72 | isa = PBXContainerItemProxy; 73 | containerPortal = D04725E119E49ED7006002AA /* Project object */; 74 | proxyType = 1; 75 | remoteGlobalIDString = D04725E919E49ED7006002AA; 76 | remoteInfo = ReactiveCocoa; 77 | }; 78 | D047261819E49F82006002AA /* PBXContainerItemProxy */ = { 79 | isa = PBXContainerItemProxy; 80 | containerPortal = D04725E119E49ED7006002AA /* Project object */; 81 | proxyType = 1; 82 | remoteGlobalIDString = D047260B19E49F82006002AA; 83 | remoteInfo = ReactiveCocoa; 84 | }; 85 | /* End PBXContainerItemProxy section */ 86 | 87 | /* Begin PBXCopyFilesBuildPhase section */ 88 | 7DFBED151CDB8CEC00EE435B /* Copy Frameworks */ = { 89 | isa = PBXCopyFilesBuildPhase; 90 | buildActionMask = 2147483647; 91 | dstPath = ""; 92 | dstSubfolderSpec = 10; 93 | files = ( 94 | 7DFBED201CDB8D7D00EE435B /* Nimble.framework in Copy Frameworks */, 95 | 7DFBED1F1CDB8D7800EE435B /* Quick.framework in Copy Frameworks */, 96 | 7DFBED1E1CDB8D7000EE435B /* ReactiveObjCBridge.framework in Copy Frameworks */, 97 | ); 98 | name = "Copy Frameworks"; 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | D01B7B6119EDD8F600D26E01 /* Copy Frameworks */ = { 102 | isa = PBXCopyFilesBuildPhase; 103 | buildActionMask = 2147483647; 104 | dstPath = ""; 105 | dstSubfolderSpec = 10; 106 | files = ( 107 | D01B7B6219EDD8FE00D26E01 /* Nimble.framework in Copy Frameworks */, 108 | D01B7B6319EDD8FE00D26E01 /* Quick.framework in Copy Frameworks */, 109 | D01B7B6419EDD94B00D26E01 /* ReactiveObjCBridge.framework in Copy Frameworks */, 110 | ); 111 | name = "Copy Frameworks"; 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | /* End PBXCopyFilesBuildPhase section */ 115 | 116 | /* Begin PBXFileReference section */ 117 | 57A4D2411BA13D7A00F7D4B1 /* ReactiveObjCBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveObjCBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 118 | 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Application.xcconfig"; sourceTree = ""; }; 119 | 57A4D2451BA13F9700F7D4B1 /* tvOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Base.xcconfig"; sourceTree = ""; }; 120 | 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-Framework.xcconfig"; sourceTree = ""; }; 121 | 57A4D2471BA13F9700F7D4B1 /* tvOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "tvOS-StaticLibrary.xcconfig"; sourceTree = ""; }; 122 | 7DFBED031CDB8C9500EE435B /* ReactiveObjCBridgeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactiveObjCBridgeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 123 | 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RACScheduler+SwiftSupport.h"; sourceTree = ""; }; 124 | 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RACScheduler+SwiftSupport.m"; sourceTree = ""; }; 125 | A97451331B3A935E00F48E55 /* watchOS-Application.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-Application.xcconfig"; sourceTree = ""; }; 126 | A97451341B3A935E00F48E55 /* watchOS-Base.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-Base.xcconfig"; sourceTree = ""; }; 127 | A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-Framework.xcconfig"; sourceTree = ""; }; 128 | A97451361B3A935E00F48E55 /* watchOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = "watchOS-StaticLibrary.xcconfig"; sourceTree = ""; }; 129 | A9B315541B3940610001CB9C /* ReactiveObjCBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveObjCBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | BE330A0E1D634F1E00806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = build/Debug/ReactiveSwift.framework; sourceTree = ""; }; 131 | BE330A101D634F2900806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = build/Debug/ReactiveSwift.framework; sourceTree = ""; }; 132 | BE330A121D634F2E00806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = "build/Debug-iphoneos/ReactiveSwift.framework"; sourceTree = ""; }; 133 | BE330A141D634F4000806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = "build/Debug-iphoneos/ReactiveSwift.framework"; sourceTree = ""; }; 134 | BE330A161D634F4E00806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = "build/Debug-watchos/ReactiveSwift.framework"; sourceTree = ""; }; 135 | BE330A181D634F5900806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = "build/Debug-appletvos/ReactiveSwift.framework"; sourceTree = ""; }; 136 | BE330A1A1D634F5F00806963 /* ReactiveSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveSwift.framework; path = "build/Debug-appletvos/ReactiveSwift.framework"; sourceTree = ""; }; 137 | BEA5E5D81D864DC900A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = build/Debug/ReactiveObjC.framework; sourceTree = ""; }; 138 | BEA5E5DA1D864DD100A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = build/Debug/ReactiveObjC.framework; sourceTree = ""; }; 139 | BEA5E5DC1D864DD800A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = "build/Debug-iphoneos/ReactiveObjC.framework"; sourceTree = ""; }; 140 | BEA5E5DE1D864DDE00A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = "build/Debug-iphoneos/ReactiveObjC.framework"; sourceTree = ""; }; 141 | BEA5E5E01D864DE800A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = "build/Debug-watchos/ReactiveObjC.framework"; sourceTree = ""; }; 142 | BEA5E5E21D864DED00A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = "build/Debug-appletvos/ReactiveObjC.framework"; sourceTree = ""; }; 143 | BEA5E5E41D864DF400A1F0F2 /* ReactiveObjC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ReactiveObjC.framework; path = "build/Debug-appletvos/ReactiveObjC.framework"; sourceTree = ""; }; 144 | BEA5E5E61D864E7200A1F0F2 /* TestError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestError.swift; sourceTree = ""; }; 145 | CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-Application.xcconfig"; sourceTree = ""; }; 146 | CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-Framework.xcconfig"; sourceTree = ""; }; 147 | CD8D21C32322E4BE00C3996F /* macOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-StaticLibrary.xcconfig"; sourceTree = ""; }; 148 | CD8D21C42322E4BE00C3996F /* macOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-Base.xcconfig"; sourceTree = ""; }; 149 | CD8D21C52322E4BE00C3996F /* macOS-XCTest.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-XCTest.xcconfig"; sourceTree = ""; }; 150 | CD8D21C62322E4BE00C3996F /* macOS-DynamicLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "macOS-DynamicLibrary.xcconfig"; sourceTree = ""; }; 151 | CDC42E2E1AE7AB8B00965373 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Result.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 152 | D037672B19EDA75D00A782A9 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Quick.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 153 | D04725EA19E49ED7006002AA /* ReactiveObjCBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveObjCBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 154 | D04725EE19E49ED7006002AA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 155 | D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReactiveObjCBridge.h; sourceTree = ""; }; 156 | D04725F519E49ED7006002AA /* ReactiveObjCBridgeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactiveObjCBridgeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 157 | D04725FB19E49ED7006002AA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 158 | D047260C19E49F82006002AA /* ReactiveObjCBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveObjCBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 159 | D047261619E49F82006002AA /* ReactiveObjCBridgeTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ReactiveObjCBridgeTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 160 | D047262719E49FE8006002AA /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; }; 161 | D047262919E49FE8006002AA /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 162 | D047262A19E49FE8006002AA /* Profile.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Profile.xcconfig; sourceTree = ""; }; 163 | D047262B19E49FE8006002AA /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; 164 | D047262C19E49FE8006002AA /* Test.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Test.xcconfig; sourceTree = ""; }; 165 | D047262E19E49FE8006002AA /* Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Application.xcconfig; sourceTree = ""; }; 166 | D047262F19E49FE8006002AA /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = ""; }; 167 | D047263019E49FE8006002AA /* StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = StaticLibrary.xcconfig; sourceTree = ""; }; 168 | D047263219E49FE8006002AA /* iOS-Application.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Application.xcconfig"; sourceTree = ""; }; 169 | D047263319E49FE8006002AA /* iOS-Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Base.xcconfig"; sourceTree = ""; }; 170 | D047263419E49FE8006002AA /* iOS-Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-Framework.xcconfig"; sourceTree = ""; }; 171 | D047263519E49FE8006002AA /* iOS-StaticLibrary.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "iOS-StaticLibrary.xcconfig"; sourceTree = ""; }; 172 | D047263C19E49FE8006002AA /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 173 | D05E662419EDD82000904ACA /* Nimble.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Nimble.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 174 | D0A226101A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = ObjectiveCBridgingSpec.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 175 | D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObjectiveCBridging.swift; sourceTree = ""; }; 176 | /* End PBXFileReference section */ 177 | 178 | /* Begin PBXFrameworksBuildPhase section */ 179 | 57A4D2071BA13D7A00F7D4B1 /* Frameworks */ = { 180 | isa = PBXFrameworksBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | BEA5E5E31D864DED00A1F0F2 /* ReactiveObjC.framework in Frameworks */, 184 | BE330A191D634F5900806963 /* ReactiveSwift.framework in Frameworks */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | 7DFBED001CDB8C9500EE435B /* Frameworks */ = { 189 | isa = PBXFrameworksBuildPhase; 190 | buildActionMask = 2147483647; 191 | files = ( 192 | BEA5E5E51D864DF400A1F0F2 /* ReactiveObjC.framework in Frameworks */, 193 | BE330A1B1D634F5F00806963 /* ReactiveSwift.framework in Frameworks */, 194 | CDF066CA1CDC1CA200199626 /* Nimble.framework in Frameworks */, 195 | CDF066CB1CDC1CA200199626 /* Quick.framework in Frameworks */, 196 | 7DFBED081CDB8C9500EE435B /* ReactiveObjCBridge.framework in Frameworks */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | A9B315501B3940610001CB9C /* Frameworks */ = { 201 | isa = PBXFrameworksBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | BEA5E5E11D864DE800A1F0F2 /* ReactiveObjC.framework in Frameworks */, 205 | BE330A171D634F4E00806963 /* ReactiveSwift.framework in Frameworks */, 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | }; 209 | D04725E619E49ED7006002AA /* Frameworks */ = { 210 | isa = PBXFrameworksBuildPhase; 211 | buildActionMask = 2147483647; 212 | files = ( 213 | BEA5E5D91D864DC900A1F0F2 /* ReactiveObjC.framework in Frameworks */, 214 | BE330A0F1D634F1E00806963 /* ReactiveSwift.framework in Frameworks */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | D04725F219E49ED7006002AA /* Frameworks */ = { 219 | isa = PBXFrameworksBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | BEA5E5DB1D864DD100A1F0F2 /* ReactiveObjC.framework in Frameworks */, 223 | BE330A111D634F2900806963 /* ReactiveSwift.framework in Frameworks */, 224 | D05E662519EDD82000904ACA /* Nimble.framework in Frameworks */, 225 | D037672D19EDA75D00A782A9 /* Quick.framework in Frameworks */, 226 | D04725F619E49ED7006002AA /* ReactiveObjCBridge.framework in Frameworks */, 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | }; 230 | D047260819E49F82006002AA /* Frameworks */ = { 231 | isa = PBXFrameworksBuildPhase; 232 | buildActionMask = 2147483647; 233 | files = ( 234 | BEA5E5DD1D864DD800A1F0F2 /* ReactiveObjC.framework in Frameworks */, 235 | BE330A131D634F2E00806963 /* ReactiveSwift.framework in Frameworks */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | D047261319E49F82006002AA /* Frameworks */ = { 240 | isa = PBXFrameworksBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | BEA5E5DF1D864DDE00A1F0F2 /* ReactiveObjC.framework in Frameworks */, 244 | BE330A151D634F4000806963 /* ReactiveSwift.framework in Frameworks */, 245 | D05E662619EDD83000904ACA /* Nimble.framework in Frameworks */, 246 | D037672F19EDA78B00A782A9 /* Quick.framework in Frameworks */, 247 | D047261719E49F82006002AA /* ReactiveObjCBridge.framework in Frameworks */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | /* End PBXFrameworksBuildPhase section */ 252 | 253 | /* Begin PBXGroup section */ 254 | 57A4D2431BA13F9700F7D4B1 /* tvOS */ = { 255 | isa = PBXGroup; 256 | children = ( 257 | 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */, 258 | 57A4D2451BA13F9700F7D4B1 /* tvOS-Base.xcconfig */, 259 | 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */, 260 | 57A4D2471BA13F9700F7D4B1 /* tvOS-StaticLibrary.xcconfig */, 261 | ); 262 | path = tvOS; 263 | sourceTree = ""; 264 | }; 265 | A97451321B3A935E00F48E55 /* watchOS */ = { 266 | isa = PBXGroup; 267 | children = ( 268 | A97451331B3A935E00F48E55 /* watchOS-Application.xcconfig */, 269 | A97451341B3A935E00F48E55 /* watchOS-Base.xcconfig */, 270 | A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */, 271 | A97451361B3A935E00F48E55 /* watchOS-StaticLibrary.xcconfig */, 272 | ); 273 | path = watchOS; 274 | sourceTree = ""; 275 | }; 276 | BE330A0D1D634F1E00806963 /* Frameworks */ = { 277 | isa = PBXGroup; 278 | children = ( 279 | BEA5E5E41D864DF400A1F0F2 /* ReactiveObjC.framework */, 280 | BEA5E5E21D864DED00A1F0F2 /* ReactiveObjC.framework */, 281 | BEA5E5E01D864DE800A1F0F2 /* ReactiveObjC.framework */, 282 | BEA5E5DE1D864DDE00A1F0F2 /* ReactiveObjC.framework */, 283 | BEA5E5DC1D864DD800A1F0F2 /* ReactiveObjC.framework */, 284 | BEA5E5DA1D864DD100A1F0F2 /* ReactiveObjC.framework */, 285 | BEA5E5D81D864DC900A1F0F2 /* ReactiveObjC.framework */, 286 | BE330A1A1D634F5F00806963 /* ReactiveSwift.framework */, 287 | BE330A181D634F5900806963 /* ReactiveSwift.framework */, 288 | BE330A161D634F4E00806963 /* ReactiveSwift.framework */, 289 | BE330A141D634F4000806963 /* ReactiveSwift.framework */, 290 | BE330A121D634F2E00806963 /* ReactiveSwift.framework */, 291 | BE330A101D634F2900806963 /* ReactiveSwift.framework */, 292 | BE330A0E1D634F1E00806963 /* ReactiveSwift.framework */, 293 | ); 294 | name = Frameworks; 295 | sourceTree = ""; 296 | }; 297 | CD8D21C02322E4BE00C3996F /* macOS */ = { 298 | isa = PBXGroup; 299 | children = ( 300 | CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */, 301 | CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */, 302 | CD8D21C32322E4BE00C3996F /* macOS-StaticLibrary.xcconfig */, 303 | CD8D21C42322E4BE00C3996F /* macOS-Base.xcconfig */, 304 | CD8D21C52322E4BE00C3996F /* macOS-XCTest.xcconfig */, 305 | CD8D21C62322E4BE00C3996F /* macOS-DynamicLibrary.xcconfig */, 306 | ); 307 | path = macOS; 308 | sourceTree = ""; 309 | }; 310 | D04725E019E49ED7006002AA = { 311 | isa = PBXGroup; 312 | children = ( 313 | D04725EC19E49ED7006002AA /* ReactiveObjCBridge */, 314 | D04725F919E49ED7006002AA /* ReactiveObjCBridgeTests */, 315 | D047262519E49FE8006002AA /* Configuration */, 316 | D04725EB19E49ED7006002AA /* Products */, 317 | BE330A0D1D634F1E00806963 /* Frameworks */, 318 | ); 319 | sourceTree = ""; 320 | usesTabs = 1; 321 | }; 322 | D04725EB19E49ED7006002AA /* Products */ = { 323 | isa = PBXGroup; 324 | children = ( 325 | D04725EA19E49ED7006002AA /* ReactiveObjCBridge.framework */, 326 | D04725F519E49ED7006002AA /* ReactiveObjCBridgeTests.xctest */, 327 | D047260C19E49F82006002AA /* ReactiveObjCBridge.framework */, 328 | D047261619E49F82006002AA /* ReactiveObjCBridgeTests.xctest */, 329 | A9B315541B3940610001CB9C /* ReactiveObjCBridge.framework */, 330 | 57A4D2411BA13D7A00F7D4B1 /* ReactiveObjCBridge.framework */, 331 | 7DFBED031CDB8C9500EE435B /* ReactiveObjCBridgeTests.xctest */, 332 | ); 333 | name = Products; 334 | sourceTree = ""; 335 | }; 336 | D04725EC19E49ED7006002AA /* ReactiveObjCBridge */ = { 337 | isa = PBXGroup; 338 | children = ( 339 | D04725EF19E49ED7006002AA /* ReactiveObjCBridge.h */, 340 | D0C312C419EF2A5800984962 /* ObjectiveCBridging.swift */, 341 | 9AB5CD631EDAC351004ECB57 /* RACScheduler+SwiftSupport.h */, 342 | 9AB5CD641EDAC351004ECB57 /* RACScheduler+SwiftSupport.m */, 343 | D04725ED19E49ED7006002AA /* Supporting Files */, 344 | ); 345 | path = ReactiveObjCBridge; 346 | sourceTree = ""; 347 | }; 348 | D04725ED19E49ED7006002AA /* Supporting Files */ = { 349 | isa = PBXGroup; 350 | children = ( 351 | CDC42E2E1AE7AB8B00965373 /* Result.framework */, 352 | D04725EE19E49ED7006002AA /* Info.plist */, 353 | ); 354 | name = "Supporting Files"; 355 | sourceTree = ""; 356 | }; 357 | D04725F919E49ED7006002AA /* ReactiveObjCBridgeTests */ = { 358 | isa = PBXGroup; 359 | children = ( 360 | D0A226101A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift */, 361 | BEA5E5E61D864E7200A1F0F2 /* TestError.swift */, 362 | D04725FA19E49ED7006002AA /* Supporting Files */, 363 | ); 364 | path = ReactiveObjCBridgeTests; 365 | sourceTree = ""; 366 | }; 367 | D04725FA19E49ED7006002AA /* Supporting Files */ = { 368 | isa = PBXGroup; 369 | children = ( 370 | D05E662419EDD82000904ACA /* Nimble.framework */, 371 | D037672B19EDA75D00A782A9 /* Quick.framework */, 372 | D04725FB19E49ED7006002AA /* Info.plist */, 373 | ); 374 | name = "Supporting Files"; 375 | sourceTree = ""; 376 | }; 377 | D047262519E49FE8006002AA /* Configuration */ = { 378 | isa = PBXGroup; 379 | children = ( 380 | D047262619E49FE8006002AA /* Base */, 381 | D047263119E49FE8006002AA /* iOS */, 382 | CD8D21C02322E4BE00C3996F /* macOS */, 383 | A97451321B3A935E00F48E55 /* watchOS */, 384 | 57A4D2431BA13F9700F7D4B1 /* tvOS */, 385 | D047263C19E49FE8006002AA /* README.md */, 386 | ); 387 | name = Configuration; 388 | path = Carthage/Checkouts/xcconfigs; 389 | sourceTree = ""; 390 | }; 391 | D047262619E49FE8006002AA /* Base */ = { 392 | isa = PBXGroup; 393 | children = ( 394 | D047262719E49FE8006002AA /* Common.xcconfig */, 395 | D047262819E49FE8006002AA /* Configurations */, 396 | D047262D19E49FE8006002AA /* Targets */, 397 | ); 398 | path = Base; 399 | sourceTree = ""; 400 | }; 401 | D047262819E49FE8006002AA /* Configurations */ = { 402 | isa = PBXGroup; 403 | children = ( 404 | D047262919E49FE8006002AA /* Debug.xcconfig */, 405 | D047262A19E49FE8006002AA /* Profile.xcconfig */, 406 | D047262B19E49FE8006002AA /* Release.xcconfig */, 407 | D047262C19E49FE8006002AA /* Test.xcconfig */, 408 | ); 409 | path = Configurations; 410 | sourceTree = ""; 411 | }; 412 | D047262D19E49FE8006002AA /* Targets */ = { 413 | isa = PBXGroup; 414 | children = ( 415 | D047262E19E49FE8006002AA /* Application.xcconfig */, 416 | D047262F19E49FE8006002AA /* Framework.xcconfig */, 417 | D047263019E49FE8006002AA /* StaticLibrary.xcconfig */, 418 | ); 419 | path = Targets; 420 | sourceTree = ""; 421 | }; 422 | D047263119E49FE8006002AA /* iOS */ = { 423 | isa = PBXGroup; 424 | children = ( 425 | D047263219E49FE8006002AA /* iOS-Application.xcconfig */, 426 | D047263319E49FE8006002AA /* iOS-Base.xcconfig */, 427 | D047263419E49FE8006002AA /* iOS-Framework.xcconfig */, 428 | D047263519E49FE8006002AA /* iOS-StaticLibrary.xcconfig */, 429 | ); 430 | path = iOS; 431 | sourceTree = ""; 432 | }; 433 | /* End PBXGroup section */ 434 | 435 | /* Begin PBXHeadersBuildPhase section */ 436 | 57A4D2091BA13D7A00F7D4B1 /* Headers */ = { 437 | isa = PBXHeadersBuildPhase; 438 | buildActionMask = 2147483647; 439 | files = ( 440 | 9AB5CD681EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */, 441 | 57A4D20A1BA13D7A00F7D4B1 /* ReactiveObjCBridge.h in Headers */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | A9B315511B3940610001CB9C /* Headers */ = { 446 | isa = PBXHeadersBuildPhase; 447 | buildActionMask = 2147483647; 448 | files = ( 449 | 9AB5CD671EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */, 450 | A9B315CA1B3940AB0001CB9C /* ReactiveObjCBridge.h in Headers */, 451 | ); 452 | runOnlyForDeploymentPostprocessing = 0; 453 | }; 454 | D04725E719E49ED7006002AA /* Headers */ = { 455 | isa = PBXHeadersBuildPhase; 456 | buildActionMask = 2147483647; 457 | files = ( 458 | 9AB5CD651EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */, 459 | D04725F019E49ED7006002AA /* ReactiveObjCBridge.h in Headers */, 460 | ); 461 | runOnlyForDeploymentPostprocessing = 0; 462 | }; 463 | D047260919E49F82006002AA /* Headers */ = { 464 | isa = PBXHeadersBuildPhase; 465 | buildActionMask = 2147483647; 466 | files = ( 467 | 9AB5CD661EDAC351004ECB57 /* RACScheduler+SwiftSupport.h in Headers */, 468 | D037666419EDA43C00A782A9 /* ReactiveObjCBridge.h in Headers */, 469 | ); 470 | runOnlyForDeploymentPostprocessing = 0; 471 | }; 472 | /* End PBXHeadersBuildPhase section */ 473 | 474 | /* Begin PBXNativeTarget section */ 475 | 57A4D1AF1BA13D7A00F7D4B1 /* ReactiveObjCBridge-tvOS */ = { 476 | isa = PBXNativeTarget; 477 | buildConfigurationList = 57A4D23C1BA13D7A00F7D4B1 /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-tvOS" */; 478 | buildPhases = ( 479 | 57A4D1B01BA13D7A00F7D4B1 /* Sources */, 480 | 57A4D2071BA13D7A00F7D4B1 /* Frameworks */, 481 | 57A4D2091BA13D7A00F7D4B1 /* Headers */, 482 | 57A4D23B1BA13D7A00F7D4B1 /* Resources */, 483 | ); 484 | buildRules = ( 485 | ); 486 | dependencies = ( 487 | ); 488 | name = "ReactiveObjCBridge-tvOS"; 489 | productName = "ReactiveObjCBridge-tvOS"; 490 | productReference = 57A4D2411BA13D7A00F7D4B1 /* ReactiveObjCBridge.framework */; 491 | productType = "com.apple.product-type.framework"; 492 | }; 493 | 7DFBED021CDB8C9500EE435B /* ReactiveObjCBridge-tvOSTests */ = { 494 | isa = PBXNativeTarget; 495 | buildConfigurationList = 7DFBED0F1CDB8C9500EE435B /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-tvOSTests" */; 496 | buildPhases = ( 497 | 7DFBECFF1CDB8C9500EE435B /* Sources */, 498 | 7DFBED001CDB8C9500EE435B /* Frameworks */, 499 | 7DFBED011CDB8C9500EE435B /* Resources */, 500 | 7DFBED151CDB8CEC00EE435B /* Copy Frameworks */, 501 | ); 502 | buildRules = ( 503 | ); 504 | dependencies = ( 505 | 7DFBED0A1CDB8C9500EE435B /* PBXTargetDependency */, 506 | ); 507 | name = "ReactiveObjCBridge-tvOSTests"; 508 | productName = "ReactiveObjCBridge-tvOSTests"; 509 | productReference = 7DFBED031CDB8C9500EE435B /* ReactiveObjCBridgeTests.xctest */; 510 | productType = "com.apple.product-type.bundle.unit-test"; 511 | }; 512 | A9B315531B3940610001CB9C /* ReactiveObjCBridge-watchOS */ = { 513 | isa = PBXNativeTarget; 514 | buildConfigurationList = A9B3155D1B3940610001CB9C /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-watchOS" */; 515 | buildPhases = ( 516 | A9B3154F1B3940610001CB9C /* Sources */, 517 | A9B315501B3940610001CB9C /* Frameworks */, 518 | A9B315511B3940610001CB9C /* Headers */, 519 | A9B315521B3940610001CB9C /* Resources */, 520 | ); 521 | buildRules = ( 522 | ); 523 | dependencies = ( 524 | ); 525 | name = "ReactiveObjCBridge-watchOS"; 526 | productName = "ReactiveObjCBridge-watchOS"; 527 | productReference = A9B315541B3940610001CB9C /* ReactiveObjCBridge.framework */; 528 | productType = "com.apple.product-type.framework"; 529 | }; 530 | D04725E919E49ED7006002AA /* ReactiveObjCBridge-macOS */ = { 531 | isa = PBXNativeTarget; 532 | buildConfigurationList = D047260019E49ED7006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-macOS" */; 533 | buildPhases = ( 534 | D04725E519E49ED7006002AA /* Sources */, 535 | D04725E619E49ED7006002AA /* Frameworks */, 536 | D04725E719E49ED7006002AA /* Headers */, 537 | D04725E819E49ED7006002AA /* Resources */, 538 | ); 539 | buildRules = ( 540 | ); 541 | dependencies = ( 542 | ); 543 | name = "ReactiveObjCBridge-macOS"; 544 | productName = "ReactiveObjCBridge-macOS"; 545 | productReference = D04725EA19E49ED7006002AA /* ReactiveObjCBridge.framework */; 546 | productType = "com.apple.product-type.framework"; 547 | }; 548 | D04725F419E49ED7006002AA /* ReactiveObjCBridge-macOSTests */ = { 549 | isa = PBXNativeTarget; 550 | buildConfigurationList = D047260319E49ED7006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-macOSTests" */; 551 | buildPhases = ( 552 | D04725F119E49ED7006002AA /* Sources */, 553 | D04725F219E49ED7006002AA /* Frameworks */, 554 | D04725F319E49ED7006002AA /* Resources */, 555 | ); 556 | buildRules = ( 557 | ); 558 | dependencies = ( 559 | D04725F819E49ED7006002AA /* PBXTargetDependency */, 560 | ); 561 | name = "ReactiveObjCBridge-macOSTests"; 562 | productName = "ReactiveObjCBridge-macOSTests"; 563 | productReference = D04725F519E49ED7006002AA /* ReactiveObjCBridgeTests.xctest */; 564 | productType = "com.apple.product-type.bundle.unit-test"; 565 | }; 566 | D047260B19E49F82006002AA /* ReactiveObjCBridge-iOS */ = { 567 | isa = PBXNativeTarget; 568 | buildConfigurationList = D047261F19E49F82006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-iOS" */; 569 | buildPhases = ( 570 | D047260719E49F82006002AA /* Sources */, 571 | D047260819E49F82006002AA /* Frameworks */, 572 | D047260919E49F82006002AA /* Headers */, 573 | D047260A19E49F82006002AA /* Resources */, 574 | ); 575 | buildRules = ( 576 | ); 577 | dependencies = ( 578 | ); 579 | name = "ReactiveObjCBridge-iOS"; 580 | productName = "ReactiveObjCBridge-iOS"; 581 | productReference = D047260C19E49F82006002AA /* ReactiveObjCBridge.framework */; 582 | productType = "com.apple.product-type.framework"; 583 | }; 584 | D047261519E49F82006002AA /* ReactiveObjCBridge-iOSTests */ = { 585 | isa = PBXNativeTarget; 586 | buildConfigurationList = D047262219E49F82006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-iOSTests" */; 587 | buildPhases = ( 588 | D047261219E49F82006002AA /* Sources */, 589 | D047261319E49F82006002AA /* Frameworks */, 590 | D047261419E49F82006002AA /* Resources */, 591 | D01B7B6119EDD8F600D26E01 /* Copy Frameworks */, 592 | ); 593 | buildRules = ( 594 | ); 595 | dependencies = ( 596 | D047261919E49F82006002AA /* PBXTargetDependency */, 597 | ); 598 | name = "ReactiveObjCBridge-iOSTests"; 599 | productName = "ReactiveObjCBridge-iOSTests"; 600 | productReference = D047261619E49F82006002AA /* ReactiveObjCBridgeTests.xctest */; 601 | productType = "com.apple.product-type.bundle.unit-test"; 602 | }; 603 | /* End PBXNativeTarget section */ 604 | 605 | /* Begin PBXProject section */ 606 | D04725E119E49ED7006002AA /* Project object */ = { 607 | isa = PBXProject; 608 | attributes = { 609 | LastSwiftUpdateCheck = 0730; 610 | LastUpgradeCheck = 1020; 611 | ORGANIZATIONNAME = GitHub; 612 | TargetAttributes = { 613 | 57A4D1AF1BA13D7A00F7D4B1 = { 614 | LastSwiftMigration = 1010; 615 | }; 616 | 7DFBED021CDB8C9500EE435B = { 617 | CreatedOnToolsVersion = 7.3.1; 618 | LastSwiftMigration = 1010; 619 | }; 620 | A9B315531B3940610001CB9C = { 621 | CreatedOnToolsVersion = 7.0; 622 | LastSwiftMigration = 1010; 623 | }; 624 | D04725E919E49ED7006002AA = { 625 | CreatedOnToolsVersion = 6.1; 626 | LastSwiftMigration = 1010; 627 | }; 628 | D04725F419E49ED7006002AA = { 629 | CreatedOnToolsVersion = 6.1; 630 | LastSwiftMigration = 1010; 631 | }; 632 | D047260B19E49F82006002AA = { 633 | CreatedOnToolsVersion = 6.1; 634 | LastSwiftMigration = 1010; 635 | }; 636 | D047261519E49F82006002AA = { 637 | CreatedOnToolsVersion = 6.1; 638 | LastSwiftMigration = 1010; 639 | }; 640 | }; 641 | }; 642 | buildConfigurationList = D04725E419E49ED7006002AA /* Build configuration list for PBXProject "ReactiveObjCBridge" */; 643 | compatibilityVersion = "Xcode 3.2"; 644 | developmentRegion = English; 645 | hasScannedForEncodings = 0; 646 | knownRegions = ( 647 | English, 648 | en, 649 | ); 650 | mainGroup = D04725E019E49ED7006002AA; 651 | productRefGroup = D04725EB19E49ED7006002AA /* Products */; 652 | projectDirPath = ""; 653 | projectRoot = ""; 654 | targets = ( 655 | D04725E919E49ED7006002AA /* ReactiveObjCBridge-macOS */, 656 | D04725F419E49ED7006002AA /* ReactiveObjCBridge-macOSTests */, 657 | D047260B19E49F82006002AA /* ReactiveObjCBridge-iOS */, 658 | D047261519E49F82006002AA /* ReactiveObjCBridge-iOSTests */, 659 | A9B315531B3940610001CB9C /* ReactiveObjCBridge-watchOS */, 660 | 57A4D1AF1BA13D7A00F7D4B1 /* ReactiveObjCBridge-tvOS */, 661 | 7DFBED021CDB8C9500EE435B /* ReactiveObjCBridge-tvOSTests */, 662 | ); 663 | }; 664 | /* End PBXProject section */ 665 | 666 | /* Begin PBXResourcesBuildPhase section */ 667 | 57A4D23B1BA13D7A00F7D4B1 /* Resources */ = { 668 | isa = PBXResourcesBuildPhase; 669 | buildActionMask = 2147483647; 670 | files = ( 671 | ); 672 | runOnlyForDeploymentPostprocessing = 0; 673 | }; 674 | 7DFBED011CDB8C9500EE435B /* Resources */ = { 675 | isa = PBXResourcesBuildPhase; 676 | buildActionMask = 2147483647; 677 | files = ( 678 | ); 679 | runOnlyForDeploymentPostprocessing = 0; 680 | }; 681 | A9B315521B3940610001CB9C /* Resources */ = { 682 | isa = PBXResourcesBuildPhase; 683 | buildActionMask = 2147483647; 684 | files = ( 685 | ); 686 | runOnlyForDeploymentPostprocessing = 0; 687 | }; 688 | D04725E819E49ED7006002AA /* Resources */ = { 689 | isa = PBXResourcesBuildPhase; 690 | buildActionMask = 2147483647; 691 | files = ( 692 | ); 693 | runOnlyForDeploymentPostprocessing = 0; 694 | }; 695 | D04725F319E49ED7006002AA /* Resources */ = { 696 | isa = PBXResourcesBuildPhase; 697 | buildActionMask = 2147483647; 698 | files = ( 699 | ); 700 | runOnlyForDeploymentPostprocessing = 0; 701 | }; 702 | D047260A19E49F82006002AA /* Resources */ = { 703 | isa = PBXResourcesBuildPhase; 704 | buildActionMask = 2147483647; 705 | files = ( 706 | ); 707 | runOnlyForDeploymentPostprocessing = 0; 708 | }; 709 | D047261419E49F82006002AA /* Resources */ = { 710 | isa = PBXResourcesBuildPhase; 711 | buildActionMask = 2147483647; 712 | files = ( 713 | ); 714 | runOnlyForDeploymentPostprocessing = 0; 715 | }; 716 | /* End PBXResourcesBuildPhase section */ 717 | 718 | /* Begin PBXSourcesBuildPhase section */ 719 | 57A4D1B01BA13D7A00F7D4B1 /* Sources */ = { 720 | isa = PBXSourcesBuildPhase; 721 | buildActionMask = 2147483647; 722 | files = ( 723 | 57A4D1B71BA13D7A00F7D4B1 /* ObjectiveCBridging.swift in Sources */, 724 | 9AB5CD6C1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */, 725 | ); 726 | runOnlyForDeploymentPostprocessing = 0; 727 | }; 728 | 7DFBECFF1CDB8C9500EE435B /* Sources */ = { 729 | isa = PBXSourcesBuildPhase; 730 | buildActionMask = 2147483647; 731 | files = ( 732 | BEA5E5EA1D864E7900A1F0F2 /* TestError.swift in Sources */, 733 | 7DFBED271CDB8DE300EE435B /* ObjectiveCBridgingSpec.swift in Sources */, 734 | ); 735 | runOnlyForDeploymentPostprocessing = 0; 736 | }; 737 | A9B3154F1B3940610001CB9C /* Sources */ = { 738 | isa = PBXSourcesBuildPhase; 739 | buildActionMask = 2147483647; 740 | files = ( 741 | A9B315BF1B3940810001CB9C /* ObjectiveCBridging.swift in Sources */, 742 | 9AB5CD6B1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */, 743 | ); 744 | runOnlyForDeploymentPostprocessing = 0; 745 | }; 746 | D04725E519E49ED7006002AA /* Sources */ = { 747 | isa = PBXSourcesBuildPhase; 748 | buildActionMask = 2147483647; 749 | files = ( 750 | D0C312DF19EF2A5800984962 /* ObjectiveCBridging.swift in Sources */, 751 | 9AB5CD691EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */, 752 | ); 753 | runOnlyForDeploymentPostprocessing = 0; 754 | }; 755 | D04725F119E49ED7006002AA /* Sources */ = { 756 | isa = PBXSourcesBuildPhase; 757 | buildActionMask = 2147483647; 758 | files = ( 759 | BEA5E5E81D864E7600A1F0F2 /* TestError.swift in Sources */, 760 | D0A226111A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift in Sources */, 761 | ); 762 | runOnlyForDeploymentPostprocessing = 0; 763 | }; 764 | D047260719E49F82006002AA /* Sources */ = { 765 | isa = PBXSourcesBuildPhase; 766 | buildActionMask = 2147483647; 767 | files = ( 768 | D0C312E019EF2A5800984962 /* ObjectiveCBridging.swift in Sources */, 769 | 9AB5CD6A1EDAC351004ECB57 /* RACScheduler+SwiftSupport.m in Sources */, 770 | ); 771 | runOnlyForDeploymentPostprocessing = 0; 772 | }; 773 | D047261219E49F82006002AA /* Sources */ = { 774 | isa = PBXSourcesBuildPhase; 775 | buildActionMask = 2147483647; 776 | files = ( 777 | BEA5E5E91D864E7700A1F0F2 /* TestError.swift in Sources */, 778 | D0A226121A72F30B00D33B74 /* ObjectiveCBridgingSpec.swift in Sources */, 779 | ); 780 | runOnlyForDeploymentPostprocessing = 0; 781 | }; 782 | /* End PBXSourcesBuildPhase section */ 783 | 784 | /* Begin PBXTargetDependency section */ 785 | 7DFBED0A1CDB8C9500EE435B /* PBXTargetDependency */ = { 786 | isa = PBXTargetDependency; 787 | target = 57A4D1AF1BA13D7A00F7D4B1 /* ReactiveObjCBridge-tvOS */; 788 | targetProxy = 7DFBED091CDB8C9500EE435B /* PBXContainerItemProxy */; 789 | }; 790 | D04725F819E49ED7006002AA /* PBXTargetDependency */ = { 791 | isa = PBXTargetDependency; 792 | target = D04725E919E49ED7006002AA /* ReactiveObjCBridge-macOS */; 793 | targetProxy = D04725F719E49ED7006002AA /* PBXContainerItemProxy */; 794 | }; 795 | D047261919E49F82006002AA /* PBXTargetDependency */ = { 796 | isa = PBXTargetDependency; 797 | target = D047260B19E49F82006002AA /* ReactiveObjCBridge-iOS */; 798 | targetProxy = D047261819E49F82006002AA /* PBXContainerItemProxy */; 799 | }; 800 | /* End PBXTargetDependency section */ 801 | 802 | /* Begin XCBuildConfiguration section */ 803 | 57A4D23D1BA13D7A00F7D4B1 /* Debug */ = { 804 | isa = XCBuildConfiguration; 805 | baseConfigurationReference = 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */; 806 | buildSettings = { 807 | DYLIB_COMPATIBILITY_VERSION = 1; 808 | DYLIB_CURRENT_VERSION = 1; 809 | ENABLE_BITCODE = YES; 810 | FRAMEWORK_SEARCH_PATHS = ( 811 | "$(inherited)", 812 | "$(PROJECT_DIR)/build/Debug-appletvos", 813 | ); 814 | GCC_PREPROCESSOR_DEFINITIONS = ( 815 | "$(inherited)", 816 | "DTRACE_PROBES_DISABLED=1", 817 | ); 818 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 819 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 820 | SWIFT_VERSION = 5.0; 821 | }; 822 | name = Debug; 823 | }; 824 | 57A4D23E1BA13D7A00F7D4B1 /* Test */ = { 825 | isa = XCBuildConfiguration; 826 | baseConfigurationReference = 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */; 827 | buildSettings = { 828 | DYLIB_COMPATIBILITY_VERSION = 1; 829 | DYLIB_CURRENT_VERSION = 1; 830 | ENABLE_BITCODE = YES; 831 | FRAMEWORK_SEARCH_PATHS = ( 832 | "$(inherited)", 833 | "$(PROJECT_DIR)/build/Debug-appletvos", 834 | ); 835 | GCC_PREPROCESSOR_DEFINITIONS = ( 836 | "$(inherited)", 837 | "DTRACE_PROBES_DISABLED=1", 838 | ); 839 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 840 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 841 | SWIFT_VERSION = 5.0; 842 | }; 843 | name = Test; 844 | }; 845 | 57A4D23F1BA13D7A00F7D4B1 /* Release */ = { 846 | isa = XCBuildConfiguration; 847 | baseConfigurationReference = 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */; 848 | buildSettings = { 849 | DYLIB_COMPATIBILITY_VERSION = 1; 850 | DYLIB_CURRENT_VERSION = 1; 851 | ENABLE_BITCODE = YES; 852 | FRAMEWORK_SEARCH_PATHS = ( 853 | "$(inherited)", 854 | "$(PROJECT_DIR)/build/Debug-appletvos", 855 | ); 856 | GCC_PREPROCESSOR_DEFINITIONS = ( 857 | "$(inherited)", 858 | "DTRACE_PROBES_DISABLED=1", 859 | ); 860 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 861 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 862 | SWIFT_VERSION = 5.0; 863 | }; 864 | name = Release; 865 | }; 866 | 57A4D2401BA13D7A00F7D4B1 /* Profile */ = { 867 | isa = XCBuildConfiguration; 868 | baseConfigurationReference = 57A4D2461BA13F9700F7D4B1 /* tvOS-Framework.xcconfig */; 869 | buildSettings = { 870 | DYLIB_COMPATIBILITY_VERSION = 1; 871 | DYLIB_CURRENT_VERSION = 1; 872 | ENABLE_BITCODE = YES; 873 | FRAMEWORK_SEARCH_PATHS = ( 874 | "$(inherited)", 875 | "$(PROJECT_DIR)/build/Debug-appletvos", 876 | ); 877 | GCC_PREPROCESSOR_DEFINITIONS = ( 878 | "$(inherited)", 879 | "DTRACE_PROBES_DISABLED=1", 880 | ); 881 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 882 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 883 | SWIFT_VERSION = 5.0; 884 | }; 885 | name = Profile; 886 | }; 887 | 7DFBED0B1CDB8C9500EE435B /* Debug */ = { 888 | isa = XCBuildConfiguration; 889 | baseConfigurationReference = 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */; 890 | buildSettings = { 891 | CODE_SIGN_IDENTITY = ""; 892 | FRAMEWORK_SEARCH_PATHS = ( 893 | "$(SDKROOT)/Developer/Library/Frameworks", 894 | "$(inherited)", 895 | "$(PROJECT_DIR)/build/Debug-appletvos", 896 | ); 897 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 898 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 899 | SWIFT_VERSION = 5.0; 900 | }; 901 | name = Debug; 902 | }; 903 | 7DFBED0C1CDB8C9500EE435B /* Test */ = { 904 | isa = XCBuildConfiguration; 905 | baseConfigurationReference = 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */; 906 | buildSettings = { 907 | CODE_SIGN_IDENTITY = ""; 908 | FRAMEWORK_SEARCH_PATHS = ( 909 | "$(SDKROOT)/Developer/Library/Frameworks", 910 | "$(inherited)", 911 | "$(PROJECT_DIR)/build/Debug-appletvos", 912 | ); 913 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 914 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 915 | SWIFT_VERSION = 5.0; 916 | }; 917 | name = Test; 918 | }; 919 | 7DFBED0D1CDB8C9500EE435B /* Release */ = { 920 | isa = XCBuildConfiguration; 921 | baseConfigurationReference = 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */; 922 | buildSettings = { 923 | CODE_SIGN_IDENTITY = ""; 924 | FRAMEWORK_SEARCH_PATHS = ( 925 | "$(SDKROOT)/Developer/Library/Frameworks", 926 | "$(inherited)", 927 | "$(PROJECT_DIR)/build/Debug-appletvos", 928 | ); 929 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 930 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 931 | SWIFT_VERSION = 5.0; 932 | }; 933 | name = Release; 934 | }; 935 | 7DFBED0E1CDB8C9500EE435B /* Profile */ = { 936 | isa = XCBuildConfiguration; 937 | baseConfigurationReference = 57A4D2441BA13F9700F7D4B1 /* tvOS-Application.xcconfig */; 938 | buildSettings = { 939 | CODE_SIGN_IDENTITY = ""; 940 | FRAMEWORK_SEARCH_PATHS = ( 941 | "$(SDKROOT)/Developer/Library/Frameworks", 942 | "$(inherited)", 943 | "$(PROJECT_DIR)/build/Debug-appletvos", 944 | ); 945 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 946 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 947 | SWIFT_VERSION = 5.0; 948 | }; 949 | name = Profile; 950 | }; 951 | A9B315591B3940610001CB9C /* Debug */ = { 952 | isa = XCBuildConfiguration; 953 | baseConfigurationReference = A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */; 954 | buildSettings = { 955 | DYLIB_COMPATIBILITY_VERSION = 1; 956 | DYLIB_CURRENT_VERSION = 1; 957 | ENABLE_BITCODE = YES; 958 | FRAMEWORK_SEARCH_PATHS = ( 959 | "$(inherited)", 960 | "$(PROJECT_DIR)/build/Debug-watchos", 961 | ); 962 | GCC_PREPROCESSOR_DEFINITIONS = ( 963 | "$(inherited)", 964 | "DTRACE_PROBES_DISABLED=1", 965 | ); 966 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 967 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 968 | SWIFT_VERSION = 5.0; 969 | }; 970 | name = Debug; 971 | }; 972 | A9B3155A1B3940610001CB9C /* Test */ = { 973 | isa = XCBuildConfiguration; 974 | baseConfigurationReference = A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */; 975 | buildSettings = { 976 | DYLIB_COMPATIBILITY_VERSION = 1; 977 | DYLIB_CURRENT_VERSION = 1; 978 | ENABLE_BITCODE = YES; 979 | FRAMEWORK_SEARCH_PATHS = ( 980 | "$(inherited)", 981 | "$(PROJECT_DIR)/build/Debug-watchos", 982 | ); 983 | GCC_PREPROCESSOR_DEFINITIONS = ( 984 | "$(inherited)", 985 | "DTRACE_PROBES_DISABLED=1", 986 | ); 987 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 988 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 989 | SWIFT_VERSION = 5.0; 990 | }; 991 | name = Test; 992 | }; 993 | A9B3155B1B3940610001CB9C /* Release */ = { 994 | isa = XCBuildConfiguration; 995 | baseConfigurationReference = A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */; 996 | buildSettings = { 997 | DYLIB_COMPATIBILITY_VERSION = 1; 998 | DYLIB_CURRENT_VERSION = 1; 999 | ENABLE_BITCODE = YES; 1000 | FRAMEWORK_SEARCH_PATHS = ( 1001 | "$(inherited)", 1002 | "$(PROJECT_DIR)/build/Debug-watchos", 1003 | ); 1004 | GCC_PREPROCESSOR_DEFINITIONS = ( 1005 | "$(inherited)", 1006 | "DTRACE_PROBES_DISABLED=1", 1007 | ); 1008 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1009 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1010 | SWIFT_VERSION = 5.0; 1011 | }; 1012 | name = Release; 1013 | }; 1014 | A9B3155C1B3940610001CB9C /* Profile */ = { 1015 | isa = XCBuildConfiguration; 1016 | baseConfigurationReference = A97451351B3A935E00F48E55 /* watchOS-Framework.xcconfig */; 1017 | buildSettings = { 1018 | DYLIB_COMPATIBILITY_VERSION = 1; 1019 | DYLIB_CURRENT_VERSION = 1; 1020 | ENABLE_BITCODE = YES; 1021 | FRAMEWORK_SEARCH_PATHS = ( 1022 | "$(inherited)", 1023 | "$(PROJECT_DIR)/build/Debug-watchos", 1024 | ); 1025 | GCC_PREPROCESSOR_DEFINITIONS = ( 1026 | "$(inherited)", 1027 | "DTRACE_PROBES_DISABLED=1", 1028 | ); 1029 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1030 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1031 | SWIFT_VERSION = 5.0; 1032 | }; 1033 | name = Profile; 1034 | }; 1035 | D04725FE19E49ED7006002AA /* Debug */ = { 1036 | isa = XCBuildConfiguration; 1037 | baseConfigurationReference = D047262919E49FE8006002AA /* Debug.xcconfig */; 1038 | buildSettings = { 1039 | BITCODE_GENERATION_MODE = bitcode; 1040 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 1041 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1042 | CLANG_WARN_COMMA = YES; 1043 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 1044 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1045 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1046 | CODE_SIGNING_REQUIRED = NO; 1047 | CURRENT_PROJECT_VERSION = 1; 1048 | ENABLE_TESTABILITY = YES; 1049 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1050 | MACOSX_DEPLOYMENT_TARGET = 10.9; 1051 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier)"; 1052 | PRODUCT_NAME = "$(PROJECT_NAME)"; 1053 | SWIFT_VERSION = 5.0; 1054 | TVOS_DEPLOYMENT_TARGET = 9.0; 1055 | VERSIONING_SYSTEM = "apple-generic"; 1056 | VERSION_INFO_PREFIX = ""; 1057 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1058 | }; 1059 | name = Debug; 1060 | }; 1061 | D04725FF19E49ED7006002AA /* Release */ = { 1062 | isa = XCBuildConfiguration; 1063 | baseConfigurationReference = D047262B19E49FE8006002AA /* Release.xcconfig */; 1064 | buildSettings = { 1065 | BITCODE_GENERATION_MODE = bitcode; 1066 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 1067 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1068 | CLANG_WARN_COMMA = YES; 1069 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 1070 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1071 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1072 | CODE_SIGNING_REQUIRED = NO; 1073 | CURRENT_PROJECT_VERSION = 1; 1074 | GCC_OPTIMIZATION_LEVEL = 0; 1075 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1076 | MACOSX_DEPLOYMENT_TARGET = 10.9; 1077 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier)"; 1078 | PRODUCT_NAME = "$(PROJECT_NAME)"; 1079 | SWIFT_COMPILATION_MODE = wholemodule; 1080 | SWIFT_VERSION = 5.0; 1081 | TVOS_DEPLOYMENT_TARGET = 9.0; 1082 | VERSIONING_SYSTEM = "apple-generic"; 1083 | VERSION_INFO_PREFIX = ""; 1084 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1085 | }; 1086 | name = Release; 1087 | }; 1088 | D047260119E49ED7006002AA /* Debug */ = { 1089 | isa = XCBuildConfiguration; 1090 | baseConfigurationReference = CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */; 1091 | buildSettings = { 1092 | DYLIB_COMPATIBILITY_VERSION = 1; 1093 | DYLIB_CURRENT_VERSION = 1; 1094 | FRAMEWORK_SEARCH_PATHS = ( 1095 | "$(inherited)", 1096 | "$(PROJECT_DIR)/build/Debug", 1097 | ); 1098 | FRAMEWORK_VERSION = A; 1099 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1100 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1101 | SWIFT_VERSION = 5.0; 1102 | }; 1103 | name = Debug; 1104 | }; 1105 | D047260219E49ED7006002AA /* Release */ = { 1106 | isa = XCBuildConfiguration; 1107 | baseConfigurationReference = CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */; 1108 | buildSettings = { 1109 | DYLIB_COMPATIBILITY_VERSION = 1; 1110 | DYLIB_CURRENT_VERSION = 1; 1111 | FRAMEWORK_SEARCH_PATHS = ( 1112 | "$(inherited)", 1113 | "$(PROJECT_DIR)/build/Debug", 1114 | ); 1115 | FRAMEWORK_VERSION = A; 1116 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1117 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1118 | SWIFT_VERSION = 5.0; 1119 | }; 1120 | name = Release; 1121 | }; 1122 | D047260419E49ED7006002AA /* Debug */ = { 1123 | isa = XCBuildConfiguration; 1124 | baseConfigurationReference = CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */; 1125 | buildSettings = { 1126 | FRAMEWORK_SEARCH_PATHS = ( 1127 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1128 | "$(inherited)", 1129 | "$(PROJECT_DIR)/build/Debug", 1130 | ); 1131 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1132 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1133 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1134 | SWIFT_VERSION = 5.0; 1135 | }; 1136 | name = Debug; 1137 | }; 1138 | D047260519E49ED7006002AA /* Release */ = { 1139 | isa = XCBuildConfiguration; 1140 | baseConfigurationReference = CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */; 1141 | buildSettings = { 1142 | FRAMEWORK_SEARCH_PATHS = ( 1143 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1144 | "$(inherited)", 1145 | "$(PROJECT_DIR)/build/Debug", 1146 | ); 1147 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1148 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1149 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1150 | SWIFT_VERSION = 5.0; 1151 | }; 1152 | name = Release; 1153 | }; 1154 | D047262019E49F82006002AA /* Debug */ = { 1155 | isa = XCBuildConfiguration; 1156 | baseConfigurationReference = D047263419E49FE8006002AA /* iOS-Framework.xcconfig */; 1157 | buildSettings = { 1158 | DYLIB_COMPATIBILITY_VERSION = 1; 1159 | DYLIB_CURRENT_VERSION = 1; 1160 | ENABLE_BITCODE = YES; 1161 | FRAMEWORK_SEARCH_PATHS = ( 1162 | "$(inherited)", 1163 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1164 | ); 1165 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1166 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1167 | SWIFT_VERSION = 5.0; 1168 | }; 1169 | name = Debug; 1170 | }; 1171 | D047262119E49F82006002AA /* Release */ = { 1172 | isa = XCBuildConfiguration; 1173 | baseConfigurationReference = D047263419E49FE8006002AA /* iOS-Framework.xcconfig */; 1174 | buildSettings = { 1175 | DYLIB_COMPATIBILITY_VERSION = 1; 1176 | DYLIB_CURRENT_VERSION = 1; 1177 | ENABLE_BITCODE = YES; 1178 | FRAMEWORK_SEARCH_PATHS = ( 1179 | "$(inherited)", 1180 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1181 | ); 1182 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1183 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1184 | SWIFT_VERSION = 5.0; 1185 | }; 1186 | name = Release; 1187 | }; 1188 | D047262319E49F82006002AA /* Debug */ = { 1189 | isa = XCBuildConfiguration; 1190 | baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */; 1191 | buildSettings = { 1192 | FRAMEWORK_SEARCH_PATHS = ( 1193 | "$(SDKROOT)/Developer/Library/Frameworks", 1194 | "$(inherited)", 1195 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1196 | ); 1197 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1198 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1199 | SWIFT_VERSION = 5.0; 1200 | }; 1201 | name = Debug; 1202 | }; 1203 | D047262419E49F82006002AA /* Release */ = { 1204 | isa = XCBuildConfiguration; 1205 | baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */; 1206 | buildSettings = { 1207 | FRAMEWORK_SEARCH_PATHS = ( 1208 | "$(SDKROOT)/Developer/Library/Frameworks", 1209 | "$(inherited)", 1210 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1211 | ); 1212 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1213 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1214 | SWIFT_VERSION = 5.0; 1215 | }; 1216 | name = Release; 1217 | }; 1218 | D047263D19E4A008006002AA /* Profile */ = { 1219 | isa = XCBuildConfiguration; 1220 | baseConfigurationReference = D047262A19E49FE8006002AA /* Profile.xcconfig */; 1221 | buildSettings = { 1222 | BITCODE_GENERATION_MODE = bitcode; 1223 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 1224 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1225 | CLANG_WARN_COMMA = YES; 1226 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 1227 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1228 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1229 | CODE_SIGNING_REQUIRED = NO; 1230 | CURRENT_PROJECT_VERSION = 1; 1231 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1232 | MACOSX_DEPLOYMENT_TARGET = 10.9; 1233 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier)"; 1234 | PRODUCT_NAME = "$(PROJECT_NAME)"; 1235 | SWIFT_VERSION = 5.0; 1236 | TVOS_DEPLOYMENT_TARGET = 9.0; 1237 | VERSIONING_SYSTEM = "apple-generic"; 1238 | VERSION_INFO_PREFIX = ""; 1239 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1240 | }; 1241 | name = Profile; 1242 | }; 1243 | D047263E19E4A008006002AA /* Profile */ = { 1244 | isa = XCBuildConfiguration; 1245 | baseConfigurationReference = CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */; 1246 | buildSettings = { 1247 | DYLIB_COMPATIBILITY_VERSION = 1; 1248 | DYLIB_CURRENT_VERSION = 1; 1249 | FRAMEWORK_SEARCH_PATHS = ( 1250 | "$(inherited)", 1251 | "$(PROJECT_DIR)/build/Debug", 1252 | ); 1253 | FRAMEWORK_VERSION = A; 1254 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1255 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1256 | SWIFT_VERSION = 5.0; 1257 | }; 1258 | name = Profile; 1259 | }; 1260 | D047263F19E4A008006002AA /* Profile */ = { 1261 | isa = XCBuildConfiguration; 1262 | baseConfigurationReference = CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */; 1263 | buildSettings = { 1264 | FRAMEWORK_SEARCH_PATHS = ( 1265 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1266 | "$(inherited)", 1267 | "$(PROJECT_DIR)/build/Debug", 1268 | ); 1269 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1270 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1271 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1272 | SWIFT_VERSION = 5.0; 1273 | }; 1274 | name = Profile; 1275 | }; 1276 | D047264019E4A008006002AA /* Profile */ = { 1277 | isa = XCBuildConfiguration; 1278 | baseConfigurationReference = D047263419E49FE8006002AA /* iOS-Framework.xcconfig */; 1279 | buildSettings = { 1280 | DYLIB_COMPATIBILITY_VERSION = 1; 1281 | DYLIB_CURRENT_VERSION = 1; 1282 | ENABLE_BITCODE = YES; 1283 | FRAMEWORK_SEARCH_PATHS = ( 1284 | "$(inherited)", 1285 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1286 | ); 1287 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1288 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1289 | SWIFT_VERSION = 5.0; 1290 | }; 1291 | name = Profile; 1292 | }; 1293 | D047264119E4A008006002AA /* Profile */ = { 1294 | isa = XCBuildConfiguration; 1295 | baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */; 1296 | buildSettings = { 1297 | FRAMEWORK_SEARCH_PATHS = ( 1298 | "$(SDKROOT)/Developer/Library/Frameworks", 1299 | "$(inherited)", 1300 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1301 | ); 1302 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1303 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1304 | SWIFT_VERSION = 5.0; 1305 | }; 1306 | name = Profile; 1307 | }; 1308 | D047264219E4A00B006002AA /* Test */ = { 1309 | isa = XCBuildConfiguration; 1310 | baseConfigurationReference = D047262C19E49FE8006002AA /* Test.xcconfig */; 1311 | buildSettings = { 1312 | BITCODE_GENERATION_MODE = bitcode; 1313 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 1314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1315 | CLANG_WARN_COMMA = YES; 1316 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO; 1317 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1318 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1319 | CODE_SIGNING_REQUIRED = NO; 1320 | CURRENT_PROJECT_VERSION = 1; 1321 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1322 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1323 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactivecocoa.$(PRODUCT_NAME:rfc1034identifier)-Tests"; 1324 | PRODUCT_NAME = "$(PROJECT_NAME)"; 1325 | SWIFT_VERSION = 5.0; 1326 | TVOS_DEPLOYMENT_TARGET = 9.0; 1327 | VERSIONING_SYSTEM = "apple-generic"; 1328 | VERSION_INFO_PREFIX = ""; 1329 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1330 | }; 1331 | name = Test; 1332 | }; 1333 | D047264319E4A00B006002AA /* Test */ = { 1334 | isa = XCBuildConfiguration; 1335 | baseConfigurationReference = CD8D21C22322E4BE00C3996F /* macOS-Framework.xcconfig */; 1336 | buildSettings = { 1337 | DYLIB_COMPATIBILITY_VERSION = 1; 1338 | DYLIB_CURRENT_VERSION = 1; 1339 | FRAMEWORK_SEARCH_PATHS = ( 1340 | "$(inherited)", 1341 | "$(PROJECT_DIR)/build/Debug", 1342 | ); 1343 | FRAMEWORK_VERSION = A; 1344 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1345 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1346 | SWIFT_VERSION = 5.0; 1347 | }; 1348 | name = Test; 1349 | }; 1350 | D047264419E4A00B006002AA /* Test */ = { 1351 | isa = XCBuildConfiguration; 1352 | baseConfigurationReference = CD8D21C12322E4BE00C3996F /* macOS-Application.xcconfig */; 1353 | buildSettings = { 1354 | FRAMEWORK_SEARCH_PATHS = ( 1355 | "$(DEVELOPER_FRAMEWORKS_DIR)", 1356 | "$(inherited)", 1357 | "$(PROJECT_DIR)/build/Debug", 1358 | ); 1359 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1360 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1361 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1362 | SWIFT_VERSION = 5.0; 1363 | }; 1364 | name = Test; 1365 | }; 1366 | D047264519E4A00B006002AA /* Test */ = { 1367 | isa = XCBuildConfiguration; 1368 | baseConfigurationReference = D047263419E49FE8006002AA /* iOS-Framework.xcconfig */; 1369 | buildSettings = { 1370 | DYLIB_COMPATIBILITY_VERSION = 1; 1371 | DYLIB_CURRENT_VERSION = 1; 1372 | ENABLE_BITCODE = YES; 1373 | FRAMEWORK_SEARCH_PATHS = ( 1374 | "$(inherited)", 1375 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1376 | ); 1377 | INFOPLIST_FILE = ReactiveObjCBridge/Info.plist; 1378 | MODULEMAP_FILE = "$(SRCROOT)/ReactiveObjCBridge/module.modulemap"; 1379 | SWIFT_VERSION = 5.0; 1380 | }; 1381 | name = Test; 1382 | }; 1383 | D047264619E4A00B006002AA /* Test */ = { 1384 | isa = XCBuildConfiguration; 1385 | baseConfigurationReference = D047263219E49FE8006002AA /* iOS-Application.xcconfig */; 1386 | buildSettings = { 1387 | FRAMEWORK_SEARCH_PATHS = ( 1388 | "$(SDKROOT)/Developer/Library/Frameworks", 1389 | "$(inherited)", 1390 | "$(PROJECT_DIR)/build/Debug-iphoneos", 1391 | ); 1392 | INFOPLIST_FILE = ReactiveObjCBridgeTests/Info.plist; 1393 | PRODUCT_NAME = "$(PROJECT_NAME)Tests"; 1394 | SWIFT_VERSION = 5.0; 1395 | }; 1396 | name = Test; 1397 | }; 1398 | /* End XCBuildConfiguration section */ 1399 | 1400 | /* Begin XCConfigurationList section */ 1401 | 57A4D23C1BA13D7A00F7D4B1 /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-tvOS" */ = { 1402 | isa = XCConfigurationList; 1403 | buildConfigurations = ( 1404 | 57A4D23D1BA13D7A00F7D4B1 /* Debug */, 1405 | 57A4D23E1BA13D7A00F7D4B1 /* Test */, 1406 | 57A4D23F1BA13D7A00F7D4B1 /* Release */, 1407 | 57A4D2401BA13D7A00F7D4B1 /* Profile */, 1408 | ); 1409 | defaultConfigurationIsVisible = 0; 1410 | defaultConfigurationName = Release; 1411 | }; 1412 | 7DFBED0F1CDB8C9500EE435B /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-tvOSTests" */ = { 1413 | isa = XCConfigurationList; 1414 | buildConfigurations = ( 1415 | 7DFBED0B1CDB8C9500EE435B /* Debug */, 1416 | 7DFBED0C1CDB8C9500EE435B /* Test */, 1417 | 7DFBED0D1CDB8C9500EE435B /* Release */, 1418 | 7DFBED0E1CDB8C9500EE435B /* Profile */, 1419 | ); 1420 | defaultConfigurationIsVisible = 0; 1421 | defaultConfigurationName = Release; 1422 | }; 1423 | A9B3155D1B3940610001CB9C /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-watchOS" */ = { 1424 | isa = XCConfigurationList; 1425 | buildConfigurations = ( 1426 | A9B315591B3940610001CB9C /* Debug */, 1427 | A9B3155A1B3940610001CB9C /* Test */, 1428 | A9B3155B1B3940610001CB9C /* Release */, 1429 | A9B3155C1B3940610001CB9C /* Profile */, 1430 | ); 1431 | defaultConfigurationIsVisible = 0; 1432 | defaultConfigurationName = Release; 1433 | }; 1434 | D04725E419E49ED7006002AA /* Build configuration list for PBXProject "ReactiveObjCBridge" */ = { 1435 | isa = XCConfigurationList; 1436 | buildConfigurations = ( 1437 | D04725FE19E49ED7006002AA /* Debug */, 1438 | D047264219E4A00B006002AA /* Test */, 1439 | D04725FF19E49ED7006002AA /* Release */, 1440 | D047263D19E4A008006002AA /* Profile */, 1441 | ); 1442 | defaultConfigurationIsVisible = 0; 1443 | defaultConfigurationName = Release; 1444 | }; 1445 | D047260019E49ED7006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-macOS" */ = { 1446 | isa = XCConfigurationList; 1447 | buildConfigurations = ( 1448 | D047260119E49ED7006002AA /* Debug */, 1449 | D047264319E4A00B006002AA /* Test */, 1450 | D047260219E49ED7006002AA /* Release */, 1451 | D047263E19E4A008006002AA /* Profile */, 1452 | ); 1453 | defaultConfigurationIsVisible = 0; 1454 | defaultConfigurationName = Release; 1455 | }; 1456 | D047260319E49ED7006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-macOSTests" */ = { 1457 | isa = XCConfigurationList; 1458 | buildConfigurations = ( 1459 | D047260419E49ED7006002AA /* Debug */, 1460 | D047264419E4A00B006002AA /* Test */, 1461 | D047260519E49ED7006002AA /* Release */, 1462 | D047263F19E4A008006002AA /* Profile */, 1463 | ); 1464 | defaultConfigurationIsVisible = 0; 1465 | defaultConfigurationName = Release; 1466 | }; 1467 | D047261F19E49F82006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-iOS" */ = { 1468 | isa = XCConfigurationList; 1469 | buildConfigurations = ( 1470 | D047262019E49F82006002AA /* Debug */, 1471 | D047264519E4A00B006002AA /* Test */, 1472 | D047262119E49F82006002AA /* Release */, 1473 | D047264019E4A008006002AA /* Profile */, 1474 | ); 1475 | defaultConfigurationIsVisible = 0; 1476 | defaultConfigurationName = Release; 1477 | }; 1478 | D047262219E49F82006002AA /* Build configuration list for PBXNativeTarget "ReactiveObjCBridge-iOSTests" */ = { 1479 | isa = XCConfigurationList; 1480 | buildConfigurations = ( 1481 | D047262319E49F82006002AA /* Debug */, 1482 | D047264619E4A00B006002AA /* Test */, 1483 | D047262419E49F82006002AA /* Release */, 1484 | D047264119E4A008006002AA /* Profile */, 1485 | ); 1486 | defaultConfigurationIsVisible = 0; 1487 | defaultConfigurationName = Release; 1488 | }; 1489 | /* End XCConfigurationList section */ 1490 | }; 1491 | rootObject = D04725E119E49ED7006002AA /* Project object */; 1492 | } 1493 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcodeproj/xcshareddata/xcschemes/ReactiveObjCBridge-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 71 | 77 | 78 | 79 | 85 | 91 | 92 | 93 | 99 | 105 | 106 | 107 | 108 | 109 | 115 | 116 | 122 | 123 | 124 | 125 | 127 | 133 | 134 | 135 | 136 | 137 | 147 | 148 | 154 | 155 | 156 | 157 | 163 | 164 | 170 | 171 | 172 | 173 | 175 | 176 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcodeproj/xcshareddata/xcschemes/ReactiveObjCBridge-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 71 | 77 | 78 | 79 | 85 | 91 | 92 | 93 | 99 | 105 | 106 | 107 | 108 | 109 | 115 | 116 | 122 | 123 | 124 | 125 | 127 | 133 | 134 | 135 | 136 | 137 | 147 | 148 | 154 | 155 | 156 | 157 | 163 | 164 | 170 | 171 | 172 | 173 | 175 | 176 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcodeproj/xcshareddata/xcschemes/ReactiveObjCBridge-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 71 | 77 | 78 | 79 | 85 | 91 | 92 | 93 | 99 | 105 | 106 | 107 | 108 | 109 | 115 | 116 | 122 | 123 | 124 | 125 | 127 | 133 | 134 | 135 | 136 | 137 | 147 | 148 | 154 | 155 | 156 | 157 | 163 | 164 | 170 | 171 | 172 | 173 | 175 | 176 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcodeproj/xcshareddata/xcschemes/ReactiveObjCBridge-watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 43 | 49 | 50 | 51 | 57 | 63 | 64 | 65 | 66 | 67 | 72 | 73 | 79 | 80 | 81 | 82 | 83 | 84 | 94 | 95 | 101 | 102 | 103 | 104 | 110 | 111 | 117 | 118 | 119 | 120 | 122 | 123 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /ReactiveObjCBridge.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 6.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2014 GitHub. All rights reserved. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/ObjectiveCBridging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectiveCBridging.swift 3 | // ReactiveObjCBridge 4 | // 5 | // Created by Justin Spahr-Summers on 2014-07-02. 6 | // Copyright (c) 2014 GitHub, Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import ReactiveObjC 11 | import ReactiveSwift 12 | 13 | enum ReactiveObjCBridgeError: Error, CustomNSError { 14 | case message(message: String) 15 | 16 | var localizedDescription: String { 17 | switch self { 18 | case .message(let message): 19 | return message 20 | } 21 | } 22 | 23 | var errorUserInfo: [String : Any] { 24 | switch self { 25 | case .message(let message): 26 | return ["message": message] 27 | } 28 | } 29 | } 30 | 31 | extension SignalProtocol { 32 | /// Turns each value into an Optional. 33 | fileprivate func optionalize() -> Signal { 34 | return signal.map(Optional.init) 35 | } 36 | } 37 | 38 | extension SignalProducerProtocol { 39 | /// Turns each value into an Optional. 40 | fileprivate func optionalize() -> SignalProducer { 41 | return producer.lift { $0.optionalize() } 42 | } 43 | } 44 | 45 | extension RACDisposable: Disposable { 46 | public convenience init(_ disposable: Disposable?) { 47 | if let disposable = disposable { 48 | self.init(block: disposable.dispose) 49 | } else { 50 | self.init() 51 | } 52 | } 53 | } 54 | 55 | extension RACScheduler: DateScheduler { 56 | /// The current date, as determined by this scheduler. 57 | public var currentDate: Date { 58 | return Date() 59 | } 60 | 61 | /// Schedule an action for immediate execution. 62 | /// 63 | /// - note: This method calls the Objective-C implementation of `schedule:` 64 | /// method. 65 | /// 66 | /// - parameters: 67 | /// - action: Closure to perform. 68 | /// 69 | /// - returns: Disposable that can be used to cancel the work before it 70 | /// begins. 71 | @discardableResult 72 | public func schedule(_ action: @escaping () -> Void) -> Disposable? { 73 | let disposable: RACDisposable? = self.schedule(action) // Call the Objective-C implementation 74 | return disposable as Disposable? 75 | } 76 | 77 | /// Schedule an action for execution at or after the given date. 78 | /// 79 | /// - parameters: 80 | /// - date: Starting date. 81 | /// - action: Closure to perform. 82 | /// 83 | /// - returns: Optional disposable that can be used to cancel the work 84 | /// before it begins. 85 | @discardableResult 86 | public func schedule(after date: Date, action: @escaping () -> Void) -> Disposable? { 87 | return self.after(date, schedule: action) 88 | } 89 | 90 | /// Schedule a recurring action at the given interval, beginning at the 91 | /// given start time. 92 | /// 93 | /// - parameters: 94 | /// - date: Starting date. 95 | /// - repeatingEvery: Repetition interval. 96 | /// - withLeeway: Some delta for repetition. 97 | /// - action: Closure of the action to perform. 98 | /// 99 | /// - returns: Optional `Disposable` that can be used to cancel the work 100 | /// before it begins. 101 | @discardableResult 102 | public func schedule(after date: Date, interval: DispatchTimeInterval, leeway: DispatchTimeInterval, action: @escaping () -> Void) -> Disposable? { 103 | return self.after(date, repeatingEvery: interval.timeInterval, withLeeway: leeway.timeInterval, schedule: action) 104 | } 105 | } 106 | 107 | extension ImmediateScheduler { 108 | /// Create `RACScheduler` that performs actions instantly. 109 | /// 110 | /// - returns: `RACScheduler` that instantly performs actions. 111 | @available(*, unavailable, message: "Use `RACScheduler.immediate` directly, or `RACScheduler.init` in a generic context.") 112 | public func toRACScheduler() -> RACScheduler { 113 | return RACScheduler.immediate() 114 | } 115 | } 116 | 117 | extension UIScheduler { 118 | /// Create `RACScheduler` for `UIScheduler` 119 | /// 120 | /// - returns: `RACScheduler` instance that queues events on main thread. 121 | @available(*, unavailable, message: "Use `RACScheduler.init` to wrap an `UIScheduler` instead.") 122 | public func toRACScheduler() -> RACScheduler { 123 | return RACScheduler(self) 124 | } 125 | } 126 | 127 | extension QueueScheduler { 128 | /// Create `RACScheduler` backed with own queue 129 | /// 130 | /// - returns: Instance `RACScheduler` that queues events on 131 | /// `QueueScheduler`'s queue. 132 | @available(*, unavailable, message: "Use `RACScheduler.init` to wrap a `QueueScheduler` instead.") 133 | public func toRACScheduler() -> RACScheduler { 134 | return RACScheduler(self) 135 | } 136 | } 137 | 138 | extension RACScheduler { 139 | /// Create a `RACScheduler` that wraps the given scheduler. 140 | /// 141 | /// - parameters: 142 | /// - scheduler: The `Scheduler` to wrap. 143 | /// 144 | /// - returns: A `RACScheduler` that schedules blocks to `scheduler`. 145 | public convenience init(_ scheduler: Scheduler) { 146 | self.init(racSwiftScheduler: RACSwiftScheduler(wrapping: scheduler)) 147 | } 148 | 149 | /// Create a `RACScheduler` that wraps the given scheduler. 150 | /// 151 | /// - parameters: 152 | /// - scheduler: The `DateScheduler` to wrap. 153 | /// 154 | /// - returns: A `RACScheduler` that schedules blocks to `scheduler`. 155 | public convenience init(_ scheduler: DateScheduler) { 156 | self.init(racSwiftScheduler: RACSwiftScheduler(wrapping: scheduler)) 157 | } 158 | } 159 | 160 | private final class RACSwiftScheduler: RACScheduler { 161 | enum Backing { 162 | case scheduler(Scheduler) 163 | case dateScheduler(DateScheduler) 164 | } 165 | 166 | private let base: Backing 167 | 168 | init(wrapping base: Scheduler) { 169 | self.base = .scheduler(base) 170 | } 171 | 172 | init(wrapping base: DateScheduler) { 173 | self.base = .dateScheduler(base) 174 | } 175 | 176 | private func wrap(_ block: @escaping () -> Void) -> () -> Void { 177 | return { 178 | Thread.current.threadDictionary["RACSchedulerCurrentSchedulerKey"] = self 179 | block() 180 | Thread.current.threadDictionary["RACSchedulerCurrentSchedulerKey"] = nil 181 | } 182 | } 183 | 184 | override func schedule(_ block: @escaping () -> Void) -> RACDisposable? { 185 | switch base { 186 | case let .scheduler(scheduler): 187 | return scheduler.schedule(wrap(block)).map(RACDisposable.init) 188 | 189 | case let .dateScheduler(scheduler): 190 | return scheduler.schedule(wrap(block)).map(RACDisposable.init) 191 | } 192 | } 193 | 194 | override func after(_ date: Date, schedule block: @escaping () -> Swift.Void) -> RACDisposable? { 195 | switch base { 196 | case let .scheduler(scheduler): 197 | Thread.sleep(until: date) 198 | return scheduler.schedule(wrap(block)).map(RACDisposable.init) 199 | 200 | case let .dateScheduler(scheduler): 201 | return scheduler.schedule(after: date, 202 | action: wrap(block)).map(RACDisposable.init) 203 | } 204 | } 205 | 206 | override func after(_ date: Date, repeatingEvery interval: TimeInterval, withLeeway leeway: TimeInterval, schedule block: @escaping () -> Void) -> RACDisposable? { 207 | switch base { 208 | case let .scheduler(scheduler): 209 | assertionFailure("Undefined behavior.") 210 | return scheduler.schedule(wrap(block)).map(RACDisposable.init) 211 | 212 | case let .dateScheduler(scheduler): 213 | return scheduler.schedule(after: date, 214 | interval: .milliseconds(Int(interval * 1000)), 215 | leeway: .milliseconds(Int(leeway * 1000)), 216 | action: wrap(block)) 217 | .map(RACDisposable.init) 218 | } 219 | } 220 | } 221 | 222 | @available(*, unavailable, renamed:"SignalProducer(_:)") 223 | public func bridgedSignalProducer(from signal: RACSignal) -> SignalProducer { 224 | fatalError() 225 | } 226 | 227 | extension SignalProducer where Error == Swift.Error { 228 | /// Create a `SignalProducer` which will subscribe to the provided signal once 229 | /// for each invocation of `start()`. 230 | /// 231 | /// - parameters: 232 | /// - signal: The signal to bridge to a signal producer. 233 | public init(_ signal: RACSignal) where Value == SignalValue? { 234 | self.init { observer, disposable in 235 | let failed: (_ error: Swift.Error?) -> Void = { error in 236 | observer.send(error: error ?? ReactiveObjCBridgeError.message(message: "Nil RACSignal error")) 237 | } 238 | 239 | disposable += signal.subscribeNext(observer.send(value:), 240 | error: failed, 241 | completed: observer.sendCompleted) 242 | } 243 | } 244 | } 245 | 246 | extension SignalProducer where Error == Swift.Error { 247 | /// Create a `SignalProducer` of 1-tuples which will subscribe to the provided 248 | /// signal once for each invocation of `start()`. 249 | /// 250 | /// - parameters: 251 | /// - signal: The signal of `RACOneTuple` objects to bridge to a signal producer of 1-tuples. 252 | public init(bridging tupleSignal: RACSignal>) where Value == First? { 253 | self.init(tupleSignal, transform: bridgedTuple(from:)) 254 | } 255 | 256 | /// Create a `SignalProducer` of 2-tuples which will subscribe to the provided 257 | /// signal once for each invocation of `start()`. 258 | /// 259 | /// - parameters: 260 | /// - signal: The signal of `RACTwoTuple` objects to bridge to a signal producer of 2-tuples. 261 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?)? { 262 | self.init(tupleSignal, transform: bridgedTuple(from:)) 263 | } 264 | 265 | /// Create a `SignalProducer` of 3-tuples which will subscribe to the provided 266 | /// signal once for each invocation of `start()`. 267 | /// 268 | /// - parameters: 269 | /// - signal: The signal of `RACThreeTuple` objects to bridge to a signal producer of 3-tuples. 270 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?)? { 271 | self.init(tupleSignal, transform: bridgedTuple(from:)) 272 | } 273 | 274 | /// Create a `SignalProducer` of 4-tuples which will subscribe to the provided 275 | /// signal once for each invocation of `start()`. 276 | /// 277 | /// - parameters: 278 | /// - signal: The signal of `RACFourTuple` objects to bridge to a signal producer of 4-tuples. 279 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?, Fourth?)? { 280 | self.init(tupleSignal, transform: bridgedTuple(from:)) 281 | } 282 | 283 | /// Create a `SignalProducer` of 5-tuples which will subscribe to the provided 284 | /// signal once for each invocation of `start()`. 285 | /// 286 | /// - parameters: 287 | /// - signal: The signal of `RACFiveTuple` objects to bridge to a signal producer of 5-tuples. 288 | public init(bridging tupleSignal: RACSignal>) where Value == (First?, Second?, Third?, Fourth?, Fifth?)? { 289 | self.init(tupleSignal, transform: bridgedTuple(from:)) 290 | } 291 | 292 | /// Create a `SignalProducer` which will subscribe to the provided signal once 293 | /// for each invocation of `start()`, mapping its values with the given 294 | /// transform. 295 | /// 296 | /// - parameters: 297 | /// - signal: The signal to bridge to a signal producer. 298 | /// - transform: The mapping closure to be applied to each of the resulting 299 | /// producer's values. 300 | internal init(_ signal: RACSignal, transform: @escaping (OriginalValue) -> NewValue?) where Value == NewValue? { 301 | self.init { observer, disposable in 302 | let failed: (_ error: Swift.Error?) -> Void = { error in 303 | observer.send(error: error ?? ReactiveObjCBridgeError.message(message: "Nil RACSignal error")) 304 | } 305 | 306 | disposable += signal.subscribeNext({ observer.send(value: $0.flatMap(transform)) }, 307 | error: failed, 308 | completed: observer.sendCompleted) 309 | } 310 | } 311 | } 312 | 313 | extension SignalProducerProtocol where Value: AnyObject { 314 | /// A bridged `RACSignal` that will `start()` the producer once for each subscription. 315 | /// 316 | /// - note: Any `interrupted` events will be silently discarded. 317 | public var bridged: RACSignal { 318 | return RACSignal.createSignal { subscriber in 319 | let selfDisposable = self.producer.start { event in 320 | switch event { 321 | case let .value(value): 322 | subscriber.sendNext(value) 323 | case let .failed(error): 324 | subscriber.sendError(error) 325 | case .completed: 326 | subscriber.sendCompleted() 327 | case .interrupted: 328 | break 329 | } 330 | } 331 | 332 | return RACDisposable(selfDisposable) 333 | } 334 | } 335 | 336 | @available(*, unavailable, message: "Use the `bridged` property instead.") 337 | public func toRACSignal() -> RACSignal { return bridged } 338 | } 339 | 340 | extension SignalProducerProtocol where Value: OptionalProtocol, Value.Wrapped: AnyObject { 341 | /// A bridged `RACSignal` that will `start()` the producer once for each subscription. 342 | /// 343 | /// - note: Any `interrupted` events will be silently discarded. 344 | /// 345 | /// - note: This overload is necessary to prevent `Optional.none` from 346 | /// being bridged to `NSNull` (instead of `nil`). 347 | /// See ReactiveObjCBridge#5 for more details. 348 | public var bridged: RACSignal { 349 | return RACSignal.createSignal { subscriber in 350 | let selfDisposable = self.producer.start { event in 351 | switch event { 352 | case let .value(value): 353 | subscriber.sendNext(value.optional) 354 | case let .failed(error): 355 | subscriber.sendError(error) 356 | case .completed: 357 | subscriber.sendCompleted() 358 | case .interrupted: 359 | break 360 | } 361 | } 362 | 363 | return RACDisposable(selfDisposable) 364 | } 365 | } 366 | 367 | @available(*, unavailable, message: "Use the `bridged` property instead.") 368 | public func toRACSignal() -> RACSignal { return bridged } 369 | } 370 | 371 | extension SignalProtocol where Value: AnyObject { 372 | /// A bridged `RACSignal` that will observe the given signal. 373 | /// 374 | /// - note: Any `interrupted` events will be silently discarded. 375 | public var bridged: RACSignal { 376 | return RACSignal.createSignal { subscriber in 377 | let selfDisposable = self.signal.observe { event in 378 | switch event { 379 | case let .value(value): 380 | subscriber.sendNext(value) 381 | case let .failed(error): 382 | subscriber.sendError(error) 383 | case .completed: 384 | subscriber.sendCompleted() 385 | case .interrupted: 386 | break 387 | } 388 | } 389 | 390 | return RACDisposable(selfDisposable) 391 | } 392 | } 393 | 394 | @available(*, unavailable, message: "Use the `bridged` property instead.") 395 | public func toRACSignal() -> RACSignal { return bridged } 396 | } 397 | 398 | extension SignalProtocol where Value: OptionalProtocol, Value.Wrapped: AnyObject { 399 | /// A bridged `RACSignal` that will observe the given signal. 400 | /// 401 | /// - note: Any `interrupted` events will be silently discarded. 402 | /// 403 | /// - note: This overload is necessary to prevent `Optional.none` from 404 | /// being bridged to `NSNull` (instead of `nil`). 405 | /// See ReactiveObjCBridge#5 for more details. 406 | public var bridged: RACSignal { 407 | return RACSignal.createSignal { subscriber in 408 | let selfDisposable = self.signal.observe { event in 409 | switch event { 410 | case let .value(value): 411 | subscriber.sendNext(value.optional) 412 | case let .failed(error): 413 | subscriber.sendError(error) 414 | case .completed: 415 | subscriber.sendCompleted() 416 | case .interrupted: 417 | break 418 | } 419 | } 420 | 421 | return RACDisposable(selfDisposable) 422 | } 423 | } 424 | 425 | @available(*, unavailable, message: "Use the `bridged` property instead.") 426 | public func toRACSignal() -> RACSignal { return bridged } 427 | } 428 | 429 | extension Action { 430 | fileprivate var isEnabledSignal: RACSignal { 431 | return self.isEnabled.producer.map { $0 as NSNumber }.bridged 432 | } 433 | } 434 | 435 | @available(*, unavailable, renamed:"Action(_:)") 436 | public func bridgedAction(from command: RACCommand) -> Action { 437 | fatalError() 438 | } 439 | 440 | extension Action where Error == Swift.Error { 441 | /// Create an Action that wraps the given command. 442 | /// 443 | /// - note: The created `Action` will not necessarily be marked as executing 444 | /// when the command is. However, the reverse is always true: the 445 | /// `RACCommand` will always be marked as executing when the action 446 | /// is. 447 | /// 448 | /// - parameters: 449 | /// - command: The command to wrap. 450 | public convenience init( 451 | _ command: RACCommand 452 | ) where Input == CommandInput?, Output == CommandOutput? { 453 | let enabledProperty = MutableProperty(true) 454 | 455 | enabledProperty <~ SignalProducer(command.enabled) 456 | .map { $0 as! Bool } 457 | .flatMapError { _ in SignalProducer(value: false) } 458 | 459 | self.init(enabledIf: enabledProperty) { input -> SignalProducer in 460 | let signal: RACSignal = command.execute(input) 461 | 462 | return SignalProducer(signal) 463 | } 464 | } 465 | } 466 | 467 | extension Action where Input: AnyObject, Output: AnyObject { 468 | /// A bridged `RACCommand` that will execute the action. 469 | /// 470 | /// - note: The returned command will not necessarily be marked as executing 471 | /// when the action is. However, the reverse is always true: the Action 472 | /// will always be marked as executing when the `RACCommand` is. 473 | public var bridged: RACCommand { 474 | return RACCommand(enabled: isEnabledSignal) { input -> RACSignal in 475 | return self.apply(input!).bridged 476 | } 477 | } 478 | 479 | @available(*, unavailable, message: "Use the `bridged` property instead.") 480 | public func toRACCommand() -> RACCommand { return bridged } 481 | } 482 | 483 | extension Action where Input: OptionalProtocol, Input.Wrapped: AnyObject, Output: AnyObject { 484 | /// A bridged `RACCommand` that will execute the action. 485 | /// 486 | /// - note: The returned command will not necessarily be marked as executing 487 | /// when the action is. However, the reverse is always true: the Action 488 | /// will always be marked as executing when the `RACCommand` is. 489 | public var bridged: RACCommand { 490 | return RACCommand(enabled: isEnabledSignal) { input -> RACSignal in 491 | return self.apply(Input(reconstructing: input)).bridged 492 | } 493 | } 494 | 495 | @available(*, unavailable, message: "Use the `bridged` property instead.") 496 | public func toRACCommand() -> RACCommand { return bridged } 497 | } 498 | 499 | extension Action where Input: AnyObject, Output: OptionalProtocol, Output.Wrapped: AnyObject { 500 | /// A bridged `RACCommand` that will execute the action. 501 | /// 502 | /// - note: The returned command will not necessarily be marked as executing 503 | /// when the action is. However, the reverse is always true: the Action 504 | /// will always be marked as executing when the `RACCommand` is. 505 | public var bridged: RACCommand { 506 | return RACCommand(enabled: isEnabledSignal) { input -> RACSignal in 507 | return self.apply(input!).bridged 508 | } 509 | } 510 | 511 | @available(*, unavailable, message: "Use the `bridged` property instead.") 512 | public func toRACCommand() -> RACCommand { return bridged } 513 | } 514 | 515 | extension Action where Input: OptionalProtocol, Input.Wrapped: AnyObject, Output: OptionalProtocol, Output.Wrapped: AnyObject { 516 | /// A bridged `RACCommand` that will execute the action. 517 | /// 518 | /// - note: The returned command will not necessarily be marked as executing 519 | /// when the action is. However, the reverse is always true: the Action 520 | /// will always be marked as executing when the RACCommand is. 521 | public var bridged: RACCommand { 522 | return RACCommand(enabled: isEnabledSignal) { input -> RACSignal in 523 | return self.apply(Input(reconstructing: input)).bridged 524 | } 525 | } 526 | 527 | @available(*, unavailable, message: "Use the `bridged` property instead.") 528 | public func toRACCommand() -> RACCommand { return bridged } 529 | } 530 | 531 | // MARK: Tuples 532 | 533 | /// Creates a Swift tuple with one element. 534 | /// 535 | /// - parameters: 536 | /// - tuple: The `RACOneTuple` to bridge to a Swift tuple. 537 | /// 538 | /// - returns: Swift tuple created from the provided `RACOneTuple` object. 539 | public func bridgedTuple(from tuple: RACOneTuple) -> (First?) { 540 | return (tuple.first) 541 | } 542 | 543 | /// Creates a Swift tuple with two elements. 544 | /// 545 | /// - parameters: 546 | /// - tuple: The `RACTwoTuple` to bridge to a Swift tuple. 547 | /// 548 | /// - returns: Swift tuple created from the provided `RACTwoTuple` object. 549 | public func bridgedTuple(from tuple: RACTwoTuple) -> (First?, Second?) { 550 | return (tuple.first, tuple.second) 551 | } 552 | 553 | /// Creates a Swift tuple with three elements. 554 | /// 555 | /// - parameters: 556 | /// - tuple: The `RACThreeTuple` to bridge to a Swift tuple. 557 | /// 558 | /// - returns: Swift tuple created from the provided `RACThreeTuple` object. 559 | public func bridgedTuple(from tuple: RACThreeTuple) -> (First?, Second?, Third?) { 560 | return (tuple.first, tuple.second, tuple.third) 561 | } 562 | 563 | /// Creates a Swift tuple with four elements. 564 | /// 565 | /// - parameters: 566 | /// - tuple: The `RACFourTuple` to bridge to a Swift tuple. 567 | /// 568 | /// - returns: Swift tuple created from the provided `RACFourTuple` object. 569 | public func bridgedTuple(from tuple: RACFourTuple) -> (First?, Second?, Third?, Fourth?) { 570 | return (tuple.first, tuple.second, tuple.third, tuple.fourth) 571 | } 572 | 573 | /// Creates a Swift tuple with five elements. 574 | /// 575 | /// - parameters: 576 | /// - tuple: The `RACFiveTuple` to bridge to a Swift tuple. 577 | /// 578 | /// - returns: Swift tuple created from the provided `RACFiveTuple` object. 579 | public func bridgedTuple(from tuple: RACFiveTuple) -> (First?, Second?, Third?, Fourth?, Fifth?) { 580 | return (tuple.first, tuple.second, tuple.third, tuple.fourth, tuple.fifth) 581 | } 582 | 583 | // MARK: - Helpers 584 | 585 | extension DispatchTimeInterval { 586 | fileprivate var timeInterval: TimeInterval { 587 | switch self { 588 | case let .seconds(s): 589 | return TimeInterval(s) 590 | case let .milliseconds(ms): 591 | return TimeInterval(TimeInterval(ms) / 1000.0) 592 | case let .microseconds(us): 593 | return TimeInterval(Int64(us) * Int64(NSEC_PER_USEC)) / TimeInterval(NSEC_PER_SEC) 594 | case let .nanoseconds(ns): 595 | return TimeInterval(ns) / TimeInterval(NSEC_PER_SEC) 596 | case .never: 597 | return .infinity 598 | @unknown default: 599 | assertionFailure() 600 | return .infinity 601 | } 602 | } 603 | } 604 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/RACScheduler+SwiftSupport.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface RACScheduler (SwiftSupport) 4 | + (RACScheduler *)schedulerWithRACSwiftScheduler:(RACScheduler *)scheduler; 5 | @end 6 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/RACScheduler+SwiftSupport.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @implementation RACScheduler (SwiftSupport) 5 | + (RACScheduler *)schedulerWithRACSwiftScheduler:(RACScheduler *)scheduler { 6 | return scheduler; 7 | } 8 | @end 9 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/ReactiveObjCBridge.h: -------------------------------------------------------------------------------- 1 | // 2 | // ReactiveObjCBridge.h 3 | // ReactiveObjCBridge 4 | // 5 | // Created by Josh Abernathy on 3/5/12. 6 | // Copyright (c) 2012 GitHub, Inc. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ReactiveObjCBridge. 12 | FOUNDATION_EXPORT double ReactiveObjCBridgeVersionNumber; 13 | 14 | //! Project version string for ReactiveObjCBridge. 15 | FOUNDATION_EXPORT const unsigned char ReactiveObjCBridgeVersionString[]; 16 | -------------------------------------------------------------------------------- /ReactiveObjCBridge/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module ReactiveObjCBridge { 2 | umbrella header "ReactiveObjCBridge.h" 3 | private header "RACScheduler+SwiftSupport.h" 4 | 5 | export * 6 | } 7 | -------------------------------------------------------------------------------- /ReactiveObjCBridgeTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /ReactiveObjCBridgeTests/ObjectiveCBridgingSpec.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectiveCBridgingSpec.swift 3 | // ReactiveObjCBridge 4 | // 5 | // Created by Justin Spahr-Summers on 2015-01-23. 6 | // Copyright (c) 2015 GitHub. All rights reserved. 7 | // 8 | 9 | import ReactiveObjC 10 | import ReactiveObjCBridge 11 | import ReactiveSwift 12 | import Nimble 13 | import Quick 14 | import XCTest 15 | 16 | class ObjectiveCBridgingSpec: QuickSpec { 17 | override func spec() { 18 | describe("RACScheduler") { 19 | var originalScheduler: RACTestScheduler! 20 | var scheduler: DateScheduler! 21 | 22 | beforeEach { 23 | originalScheduler = RACTestScheduler() 24 | scheduler = originalScheduler as DateScheduler 25 | } 26 | 27 | it("gives current date") { 28 | let expected = Date() 29 | let actual = scheduler.currentDate 30 | expect(actual.timeIntervalSinceReferenceDate).to(beCloseTo(expected.timeIntervalSinceReferenceDate, within: 0.0003)) 31 | } 32 | 33 | it("schedules actions") { 34 | var actionRan: Bool = false 35 | 36 | scheduler.schedule { 37 | actionRan = true 38 | } 39 | 40 | expect(actionRan) == false 41 | originalScheduler.step() 42 | expect(actionRan) == true 43 | } 44 | 45 | it("does not invoke action if disposed") { 46 | var actionRan: Bool = false 47 | 48 | let disposable: Disposable? = scheduler.schedule { 49 | actionRan = true 50 | } 51 | 52 | expect(actionRan) == false 53 | disposable!.dispose() 54 | originalScheduler.step() 55 | expect(actionRan) == false 56 | } 57 | } 58 | 59 | describe("signalProducer") { 60 | it("should subscribe once per start()") { 61 | var subscriptions = 0 62 | 63 | let racSignal = RACSignal.createSignal { subscriber in 64 | subscriber.sendNext(subscriptions) 65 | subscriber.sendCompleted() 66 | 67 | subscriptions += 1 68 | 69 | return nil 70 | } 71 | 72 | let producer = SignalProducer(racSignal).map { $0 as! Int } 73 | 74 | expect { try producer.single()?.get() } == 0 75 | expect { try producer.single()?.get() } == 1 76 | expect { try producer.single()?.get() } == 2 77 | } 78 | 79 | it("should forward errors") { 80 | let error = TestError.default 81 | 82 | let racSignal = RACSignal.error(error) 83 | let producer = SignalProducer(racSignal) 84 | let result = producer.last() 85 | 86 | expect { try result?.get() }.to(throwError(error)) 87 | } 88 | } 89 | 90 | describe("toRACSignal") { 91 | let key = NSLocalizedDescriptionKey 92 | let userInfo: [String: String] = [key: "TestValue"] 93 | let testNSError = NSError(domain: "TestDomain", code: 1, userInfo: userInfo) 94 | describe("on a Signal") { 95 | it("should forward events") { 96 | let (signal, observer) = Signal.pipe() 97 | let racSignal = signal.bridged 98 | 99 | var lastValue: NSNumber? 100 | var didComplete = false 101 | 102 | racSignal.subscribeNext({ number in 103 | lastValue = number 104 | }, completed: { 105 | didComplete = true 106 | }) 107 | 108 | expect(lastValue).to(beNil()) 109 | 110 | for number in [1, 2, 3] { 111 | observer.send(value: number as NSNumber) 112 | expect(lastValue) == number as NSNumber 113 | } 114 | 115 | expect(didComplete) == false 116 | observer.sendCompleted() 117 | expect(didComplete) == true 118 | } 119 | 120 | it("should convert errors to NSError") { 121 | let (signal, observer) = Signal.pipe() 122 | let racSignal = signal.bridged 123 | 124 | let expectedError = TestError.error2 125 | var error: TestError? 126 | 127 | racSignal.subscribeError { 128 | error = $0 as? TestError 129 | return 130 | } 131 | 132 | observer.send(error: expectedError) 133 | expect(error) == expectedError 134 | } 135 | 136 | it("should maintain userInfo on NSError") { 137 | let (signal, observer) = Signal.pipe() 138 | let racSignal = signal.bridged 139 | 140 | var error: String? 141 | 142 | racSignal.subscribeError { 143 | error = $0?.localizedDescription 144 | return 145 | } 146 | 147 | observer.send(error: testNSError) 148 | 149 | expect(error) == userInfo[key] 150 | } 151 | 152 | it("should bridge next events with value Optional.none to nil in Objective-C") { 153 | let (signal, observer) = Signal, NSError>.pipe() 154 | let racSignal = signal.bridged.replay().materialize() 155 | 156 | observer.send(value: nil) 157 | observer.sendCompleted() 158 | 159 | let event = racSignal.first() 160 | expect(event?.value).to(beNil()) 161 | } 162 | } 163 | 164 | describe("on a SignalProducer") { 165 | it("should start once per subscription") { 166 | var subscriptions = 0 167 | 168 | let producer = SignalProducer { () -> Result in 169 | defer { 170 | subscriptions += 1 171 | } 172 | 173 | return .success(subscriptions as NSNumber) 174 | } 175 | 176 | let racSignal = producer.bridged 177 | 178 | expect(racSignal.first()) == 0 179 | expect(racSignal.first()) == 1 180 | expect(racSignal.first()) == 2 181 | } 182 | 183 | it("should convert errors to NSError") { 184 | let producer = SignalProducer(error: .error1) 185 | let racSignal = producer.bridged.materialize() 186 | 187 | let event = racSignal.first() 188 | expect(event?.error as NSError?) == TestError.error1 as NSError 189 | } 190 | 191 | it("should maintain userInfo on NSError") { 192 | let producer = SignalProducer(error: testNSError) 193 | let racSignal = producer.bridged.materialize() 194 | 195 | let event = racSignal.first() 196 | let userInfoValue = event?.error?.localizedDescription 197 | expect(userInfoValue) == userInfo[key] 198 | } 199 | 200 | it("should bridge next events with value Optional.none to nil in Objective-C") { 201 | let producer = SignalProducer, NSError>(value: nil) 202 | let racSignal = producer.bridged.materialize() 203 | 204 | let event = racSignal.first() 205 | expect(event?.value).to(beNil()) 206 | } 207 | } 208 | } 209 | 210 | describe("toAction") { 211 | var command: RACCommand! 212 | var results: [Int] = [] 213 | 214 | var enabledSubject: RACSubject! 215 | var enabled = false 216 | 217 | var action: Action! 218 | 219 | beforeEach { 220 | enabledSubject = RACSubject() 221 | results = [] 222 | 223 | let enabledSignal = RACSignal.createSignal { subscriber in 224 | return enabledSubject.subscribe(subscriber) 225 | } 226 | 227 | command = RACCommand(enabled: enabledSignal) { input in 228 | let inputNumber = input as! Int + 1 229 | return RACSignal.`return`(inputNumber as NSNumber) 230 | } 231 | 232 | expect(command).notTo(beNil()) 233 | 234 | command.enabled.subscribeNext { enabled = $0 as! Bool } 235 | expect(enabled) == true 236 | 237 | let values = SignalProducer(command.executionSignals) 238 | .map { SignalProducer($0!) } 239 | .flatten(.concat) 240 | .materializeResults() 241 | .filterMap { try? $0.get() as? Int } 242 | 243 | values.startWithValues { results.append($0) } 244 | expect(results) == [] 245 | 246 | action = Action(command) 247 | } 248 | 249 | it("should reflect the enabledness of the command") { 250 | expect(action.isEnabled.value) == true 251 | 252 | enabledSubject.sendNext(false) 253 | expect(enabled).toEventually(beFalsy()) 254 | expect(action.isEnabled.value) == false 255 | } 256 | 257 | it("should execute the command once per start()") { 258 | let producer = action.apply(0 as NSNumber) 259 | expect(results) == [] 260 | 261 | producer.start() 262 | expect(results).toEventually(equal([ 1 ])) 263 | 264 | producer.start() 265 | expect(results).toEventually(equal([ 1, 1 ])) 266 | 267 | let otherProducer = action.apply(2 as NSNumber) 268 | expect(results) == [ 1, 1 ] 269 | 270 | otherProducer.start() 271 | expect(results).toEventually(equal([ 1, 1, 3 ])) 272 | 273 | producer.start() 274 | expect(results).toEventually(equal([ 1, 1, 3, 1 ])) 275 | } 276 | } 277 | 278 | describe("toRACCommand") { 279 | var action: Action! 280 | var results: [NSString] = [] 281 | 282 | var enabledProperty: MutableProperty! 283 | 284 | var command: RACCommand! 285 | var enabled = false 286 | 287 | beforeEach { 288 | results = [] 289 | enabledProperty = MutableProperty(true) 290 | 291 | action = Action(enabledIf: enabledProperty) { input in 292 | let inputNumber = input.intValue 293 | return SignalProducer(value: "\(inputNumber + 1)" as NSString) 294 | } 295 | 296 | expect(action.isEnabled.value) == true 297 | 298 | action.values.observeValues { results.append($0) } 299 | 300 | command = action.bridged 301 | expect(command).notTo(beNil()) 302 | 303 | command.enabled.subscribeNext { enabled = $0 as! Bool } 304 | expect(enabled) == true 305 | } 306 | 307 | it("should reflect the enabledness of the action") { 308 | enabledProperty.value = false 309 | expect(enabled).toEventually(beFalsy()) 310 | 311 | enabledProperty.value = true 312 | expect(enabled).toEventually(beTruthy()) 313 | } 314 | 315 | it("should apply and start a signal once per execution") { 316 | let signal = command.execute(0) 317 | 318 | do { 319 | try signal.asynchronouslyWaitUntilCompleted() 320 | expect(results) == [ "1" ] 321 | 322 | try signal.asynchronouslyWaitUntilCompleted() 323 | expect(results) == [ "1" ] 324 | 325 | try command.execute(2 as NSNumber).asynchronouslyWaitUntilCompleted() 326 | expect(results) == [ "1", "3" ] 327 | } catch { 328 | XCTFail("Failed to wait for completion") 329 | } 330 | } 331 | 332 | it("should bridge both inputs and ouputs with Optional.none to nil in Objective-C") { 333 | var action: Action, Optional, TestError>! 334 | var command: RACCommand! 335 | 336 | action = Action { input in 337 | return SignalProducer(value: input) 338 | } 339 | 340 | command = action.bridged 341 | expect(command).notTo(beNil()) 342 | 343 | let racSignal = command.executionSignals.flatten().materialize().replay() 344 | 345 | command.execute(Optional.none) 346 | 347 | let event = try! racSignal.asynchronousFirstOrDefault(nil, success: nil) 348 | expect(event.value).to(beNil()) 349 | } 350 | 351 | it("should bridge outputs with Optional.none to nil in Objective-C") { 352 | var action: Action, TestError>! 353 | var command: RACCommand! 354 | 355 | action = Action { _ in 356 | return SignalProducer(value: Optional.none) 357 | } 358 | 359 | command = action.bridged 360 | expect(command).notTo(beNil()) 361 | 362 | let racSignal = command.executionSignals.flatten().materialize().replay() 363 | 364 | command.execute("input" as NSString) 365 | 366 | let event = try! racSignal.asynchronousFirstOrDefault(nil, success: nil) 367 | expect(event.value).to(beNil()) 368 | } 369 | 370 | it("should bridge inputs with Optional.none to nil in Objective-C") { 371 | var action: Action, NSString, TestError>! 372 | var command: RACCommand! 373 | 374 | let inputSubject = RACSubject() 375 | 376 | let inputSignal = RACSignal 377 | .createSignal { subscriber in 378 | return inputSubject.subscribe(subscriber) 379 | } 380 | .replay() 381 | .materialize() 382 | 383 | action = Action { input in 384 | inputSubject.sendNext(input) 385 | return SignalProducer(value: "result") 386 | } 387 | 388 | command = action.bridged 389 | expect(command).notTo(beNil()) 390 | 391 | command.execute(Optional.none) 392 | 393 | let event = try! inputSignal.asynchronousFirstOrDefault(nil, success: nil) 394 | expect(event.value).to(beNil()) 395 | } 396 | } 397 | 398 | describe("RACSubscriber.sendNext") { 399 | it("should have an argument of type Optional.none represented as `nil`") { 400 | let racSignal = RACSignal.createSignal { subscriber in 401 | subscriber.sendNext(Optional.none) 402 | subscriber.sendCompleted() 403 | return nil 404 | } 405 | 406 | let event = try! racSignal.materialize().asynchronousFirstOrDefault(nil, success: nil) 407 | let value = event.value 408 | expect(value).to(beNil()) 409 | } 410 | } 411 | 412 | describe("RACDisposable") { 413 | it("should create a disposable that wraps a Swift disposable") { 414 | let swiftDisposable = AnyDisposable() 415 | let objcDisposable = RACDisposable(swiftDisposable) 416 | expect(swiftDisposable.isDisposed) == false 417 | 418 | objcDisposable.dispose() 419 | expect(swiftDisposable.isDisposed) == true 420 | } 421 | } 422 | 423 | context("re tuples") { 424 | describe("bridgedTuple") { 425 | it("should bridge 1-tuples") { 426 | let racTuple = RACOneTuple.pack(0) 427 | let tuple = bridgedTuple(from: racTuple) 428 | 429 | expect(tuple) == (0) 430 | } 431 | 432 | it("should bridge 2-tuples") { 433 | let racTuple = RACTwoTuple.pack(0, 1) 434 | let tuple = bridgedTuple(from: racTuple) 435 | 436 | expect(Mirror(reflecting: tuple).children.count) == 2 437 | expect(tuple.0) == 0 438 | expect(tuple.1) == 1 439 | } 440 | 441 | it("should bridge 3-tuples") { 442 | let racTuple = RACThreeTuple.pack(0, 1, 2) 443 | let tuple = bridgedTuple(from: racTuple) 444 | 445 | expect(Mirror(reflecting: tuple).children.count) == 3 446 | expect(tuple.0) == 0 447 | expect(tuple.1) == 1 448 | expect(tuple.2) == 2 449 | } 450 | 451 | it("should bridge 4-tuples") { 452 | let racTuple = RACFourTuple.pack(0, 1, 2, 3) 453 | let tuple = bridgedTuple(from: racTuple) 454 | 455 | expect(Mirror(reflecting: tuple).children.count) == 4 456 | expect(tuple.0) == 0 457 | expect(tuple.1) == 1 458 | expect(tuple.2) == 2 459 | expect(tuple.3) == 3 460 | } 461 | 462 | it("should bridge 5-tuples") { 463 | let racTuple = RACFiveTuple.pack(0, 1, 2, 3, 4) 464 | let tuple = bridgedTuple(from: racTuple) 465 | 466 | expect(Mirror(reflecting: tuple).children.count) == 5 467 | expect(tuple.0) == 0 468 | expect(tuple.1) == 1 469 | expect(tuple.2) == 2 470 | expect(tuple.3) == 3 471 | expect(tuple.4) == 4 472 | } 473 | 474 | it("should bridge tuples containing nils") { 475 | let racTuple = RACThreeTuple.pack(nil, nil, nil) 476 | let tuple = bridgedTuple(from: racTuple) 477 | 478 | expect(Mirror(reflecting: tuple).children.count) == 3 479 | expect(tuple.0).to(beNil()) 480 | expect(tuple.1).to(beNil()) 481 | expect(tuple.2).to(beNil()) 482 | } 483 | 484 | it("should bridge tuples containing both nils and values") { 485 | let racTuple = RACThreeTuple.pack("rose", nil, "petal") 486 | let tuple = bridgedTuple(from: racTuple) 487 | 488 | expect(Mirror(reflecting: tuple).children.count) == 3 489 | expect(tuple.0) == "rose" 490 | expect(tuple.1).to(beNil()) 491 | expect(tuple.2) == "petal" 492 | } 493 | } 494 | 495 | describe("bridgedSignalProducer") { 496 | it("should bridge signals of 1-tuples") { 497 | let racSignal = RACSignal>.return(RACOneTuple.pack(0)) 498 | let producer = SignalProducer(bridging: racSignal) 499 | 500 | expect { try producer.single()?.get() as? Int } == 0 501 | } 502 | 503 | it("should bridge signals of 2-tuples") { 504 | let racSignal = RACSignal>.return(RACTwoTuple.pack(0, 1)) 505 | let producer = SignalProducer(bridging: racSignal) 506 | 507 | let value = try? producer.single()?.get() 508 | let valueMirror = value.map { Mirror(reflecting: $0) } 509 | expect(valueMirror?.children.count) == 2 510 | expect(value?.0) == 0 511 | expect(value?.1) == 1 512 | } 513 | 514 | it("should bridge signals of 3-tuples") { 515 | let racSignal = RACSignal>.return(RACThreeTuple.pack(0, 1, 2)) 516 | let producer = SignalProducer(bridging: racSignal).skipNil() 517 | 518 | let value = try? producer.single()?.get() 519 | let valueMirror = value.map { Mirror(reflecting: $0) } 520 | expect(valueMirror?.children.count) == 3 521 | expect(value?.0) == 0 522 | expect(value?.1) == 1 523 | expect(value?.2) == 2 524 | } 525 | 526 | it("should bridge signals of 4-tuples") { 527 | let racSignal = RACSignal>.return(RACFourTuple.pack(0, 1, 2, 3)) 528 | let producer = SignalProducer(bridging: racSignal).skipNil() 529 | 530 | let value = try? producer.single()?.get() 531 | let valueMirror = value.map { Mirror(reflecting: $0) } 532 | expect(valueMirror?.children.count) == 4 533 | expect(value?.0) == 0 534 | expect(value?.1) == 1 535 | expect(value?.2) == 2 536 | expect(value?.3) == 3 537 | } 538 | 539 | it("should bridge signals of 5-tuples") { 540 | let racSignal = RACSignal>.return(RACFiveTuple.pack(0, 1, 2, 3, 4)) 541 | let producer = SignalProducer(bridging: racSignal).skipNil() 542 | 543 | let value = try? producer.single()?.get() 544 | let valueMirror = value.map { Mirror(reflecting: $0) } 545 | expect(valueMirror?.children.count) == 5 546 | expect(value?.0) == 0 547 | expect(value?.1) == 1 548 | expect(value?.2) == 2 549 | expect(value?.3) == 3 550 | expect(value?.4) == 4 551 | } 552 | 553 | it("should bridge signals of unnumbered tuples") { 554 | let racSignal = RACSignal.return(RACTuple(objectsFrom: [0, 1])) 555 | let producer = SignalProducer(racSignal).skipNil() 556 | 557 | let value = try? producer.single()?.get() 558 | expect(value?.count) == 2 559 | expect(value?.first as? Int) == 0 560 | expect(value?.second as? Int) == 1 561 | expect(value?.third).to(beNil()) 562 | } 563 | } 564 | } 565 | } 566 | } 567 | 568 | extension SignalProducer where Error == Never { 569 | /// Create a `SignalProducer` that will attempt the given operation once for 570 | /// each invocation of `start()`. 571 | /// 572 | /// Upon success, the started signal will send the resulting value then 573 | /// complete. Upon failure, the started signal will fail with the error that 574 | /// occurred. 575 | /// 576 | /// - parameters: 577 | /// - action: A closure that returns instance of `Result`. 578 | public init(_ action: @escaping () -> Result) { 579 | self.init { observer, _ in 580 | switch action() { 581 | case .success(let value): 582 | observer.send(value: value) 583 | observer.sendCompleted() 584 | } 585 | } 586 | } 587 | } 588 | -------------------------------------------------------------------------------- /ReactiveObjCBridgeTests/TestError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TestError.swift 3 | // ReactiveSwift 4 | // 5 | // Created by Almas Sapargali on 1/26/15. 6 | // Copyright (c) 2015 GitHub. All rights reserved. 7 | // 8 | 9 | import ReactiveSwift 10 | 11 | internal enum TestError: Int { 12 | case `default` = 0 13 | case error1 = 1 14 | case error2 = 2 15 | } 16 | 17 | extension TestError: Error { 18 | } 19 | 20 | internal extension SignalProducerProtocol { 21 | /// Halts if an error is emitted in the receiver signal. 22 | /// This is useful in tests to be able to just use `startWithNext` 23 | /// in cases where we know that an error won't be emitted. 24 | func assumeNoErrors() -> SignalProducer { 25 | return self.producer.lift { $0.assumeNoErrors() } 26 | } 27 | } 28 | 29 | internal extension SignalProtocol { 30 | /// Halts if an error is emitted in the receiver signal. 31 | /// This is useful in tests to be able to just use `startWithNext` 32 | /// in cases where we know that an error won't be emitted. 33 | func assumeNoErrors() -> Signal { 34 | return self.signal.mapError { error in 35 | fatalError("Unexpected error: \(error)") 36 | 37 | () 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /script/build: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | BUILD_DIRECTORY="build" 4 | CONFIGURATION=Release 5 | 6 | if [[ -z $TRAVIS_XCODE_WORKSPACE ]]; then 7 | echo "Error: \$TRAVIS_XCODE_WORKSPACE is not set." 8 | exit 1 9 | fi 10 | 11 | if [[ -z $TRAVIS_XCODE_SCHEME ]]; then 12 | echo "Error: \$TRAVIS_XCODE_SCHEME is not set!" 13 | exit 1 14 | fi 15 | 16 | if [[ -z $XCODE_ACTION ]]; then 17 | echo "Error: \$XCODE_ACTION is not set!" 18 | exit 1 19 | fi 20 | 21 | if [[ -z $XCODE_SDK ]]; then 22 | echo "Error: \$XCODE_SDK is not set!" 23 | exit 1 24 | fi 25 | 26 | if [[ -z $XCODE_DESTINATION ]]; then 27 | echo "Error: \$XCODE_DESTINATION is not set!" 28 | exit 1 29 | fi 30 | 31 | set -o pipefail 32 | xcodebuild $XCODE_ACTION \ 33 | -workspace "$TRAVIS_XCODE_WORKSPACE" \ 34 | -scheme "$TRAVIS_XCODE_SCHEME" \ 35 | -sdk "$XCODE_SDK" \ 36 | -destination "$XCODE_DESTINATION" \ 37 | -derivedDataPath "${BUILD_DIRECTORY}" \ 38 | -configuration $CONFIGURATION \ 39 | ENABLE_TESTABILITY=YES \ 40 | GCC_GENERATE_DEBUGGING_SYMBOLS=NO \ 41 | RUN_CLANG_STATIC_ANALYZER=NO | xcpretty 42 | result=$? 43 | 44 | if [ "$result" -ne 0 ]; then 45 | exit $result 46 | fi 47 | 48 | # Compile code in playgrounds 49 | if [[ "$XCODE_PLAYGROUND_TARGET" ]]; then 50 | echo "Validating playground..." 51 | . script/validate-playground.sh 52 | fi 53 | -------------------------------------------------------------------------------- /script/update-version: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [[ -z "$1" ]]; then 4 | echo "Please specify a version tag." 5 | exit 6 | fi 7 | 8 | PRERELEASE_STRIPPED=$(echo "$1" | perl -0777 -ne '/([0-9]+)\.([0-9]+)\.([0-9]+)(-.*)?/ and print "$1.$2.$3"') 9 | 10 | if [[ -z "$PRERELEASE_STRIPPED" ]]; then 11 | echo "The version tag is not semver compliant." 12 | exit 13 | fi 14 | 15 | CURRENT_TAG=$(perl -0777 -ne '/s.version([\s]+)=([\s]+)"(.+)"/ and print $3' *.podspec) 16 | echo "Current tag: $CURRENT_TAG" 17 | 18 | perl -0777 -i -pe 's/s.version([\s]+)=([\s]+)"'${CURRENT_TAG}'"/s.version$1=$2"'${1}'"/' *.podspec 19 | perl -0777 -i -pe 's/g>'${CURRENT_TAG}'<\/str/g>'${PRERELEASE_STRIPPED}'<\/str/' */Info.plist 20 | perl -0777 -i -pe 's/g>'${CURRENT_TAG}'<\/str/g>'${PRERELEASE_STRIPPED}'<\/str/' */*/Info.plist 21 | sed -i '' '3i\ 22 | \ 23 | # '${1} CHANGELOG.md 24 | 25 | --------------------------------------------------------------------------------