From 212f475723171f5a8290fa64431572a547604ecc Mon Sep 17 00:00:00 2001 From: Marcel Bradea Date: Thu, 3 Dec 2015 12:43:04 -0500 Subject: [PATCH 1/6] Fixed bug with not being able to create Events when including in Swift 2 module/framework (NOTE: structs must have a public initializer defined to be accessed outside of their defining module) --- Observable-Swift/Event.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Observable-Swift/Event.swift b/Observable-Swift/Event.swift index d056e09..4796dec 100644 --- a/Observable-Swift/Event.swift +++ b/Observable-Swift/Event.swift @@ -17,6 +17,9 @@ public struct Event: UnownableEvent { public typealias HandlerType = SubscriptionType.HandlerType internal var _subscriptions = [SubscriptionType]() + + public init() { + } public mutating func notify(value: T) { _subscriptions = _subscriptions.filter { $0.valid() } From ac0a2cf59af8968deaf3cdeafec76cef50b50a22 Mon Sep 17 00:00:00 2001 From: Marcel Bradea Date: Thu, 3 Dec 2015 12:13:36 -0500 Subject: [PATCH 2/6] Renamed product to Observables --- .../contents.xcworkspacedata | 7 -- Observable-Swift/Observable.h | 19 ----- ...pec.json => Observables-Swift.podspec.json | 10 +-- .../project.pbxproj | 76 +++++++++---------- .../contents.xcworkspacedata | 7 ++ .../xcschemes/Observables-iOS.xcscheme | 20 ++--- .../xcschemes/Observables.xcscheme | 20 ++--- .../Event.swift | 2 +- .../EventReference.swift | 2 +- .../EventSubscription.swift | 2 +- .../Info.plist | 0 Observables-Swift/Observable.h | 19 +++++ .../Observable.swift | 2 +- .../ObservableChainingProxy.swift | 2 +- .../ObservableProxy.swift | 2 +- .../ObservableReference.swift | 2 +- .../OwningEventReference.swift | 4 +- .../Protocols.swift | 2 +- .../TupleObservable.swift | 2 +- .../Info.plist | 0 .../ObservableTests.swift | 4 +- README.md | 8 +- 22 files changed, 106 insertions(+), 106 deletions(-) delete mode 100644 Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Observable-Swift/Observable.h rename Observable-Swift.podspec.json => Observables-Swift.podspec.json (72%) rename {Observable-Swift.xcodeproj => Observables-Swift.xcodeproj}/project.pbxproj (92%) create mode 100644 Observables-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme => Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables-iOS.xcscheme (84%) rename Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable.xcscheme => Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables.xcscheme (84%) rename {Observable-Swift => Observables-Swift}/Event.swift (99%) rename {Observable-Swift => Observables-Swift}/EventReference.swift (98%) rename {Observable-Swift => Observables-Swift}/EventSubscription.swift (98%) rename {Observable-Swift => Observables-Swift}/Info.plist (100%) create mode 100644 Observables-Swift/Observable.h rename {Observable-Swift => Observables-Swift}/Observable.swift (98%) rename {Observable-Swift => Observables-Swift}/ObservableChainingProxy.swift (99%) rename {Observable-Swift => Observables-Swift}/ObservableProxy.swift (98%) rename {Observable-Swift => Observables-Swift}/ObservableReference.swift (96%) rename {Observable-Swift => Observables-Swift}/OwningEventReference.swift (98%) rename {Observable-Swift => Observables-Swift}/Protocols.swift (99%) rename {Observable-Swift => Observables-Swift}/TupleObservable.swift (99%) rename {Observable-SwiftTests => Observables-SwiftTests}/Info.plist (100%) rename {Observable-SwiftTests => Observables-SwiftTests}/ObservableTests.swift (99%) diff --git a/Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 4df54a3..0000000 --- a/Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Observable-Swift/Observable.h b/Observable-Swift/Observable.h deleted file mode 100644 index 3c58995..0000000 --- a/Observable-Swift/Observable.h +++ /dev/null @@ -1,19 +0,0 @@ -// -// Observable-Swift.h -// Observable-Swift -// -// Created by Leszek Ślażyński on 20/06/14. -// Copyright (c) 2014 Leszek Ślażyński. All rights reserved. -// - -#import - -//! Project version number for Observable-Swift. -FOUNDATION_EXPORT double ObservableVersionNumber; - -//! Project version string for Observable-Swift. -FOUNDATION_EXPORT const unsigned char ObservableVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Observable-Swift.podspec.json b/Observables-Swift.podspec.json similarity index 72% rename from Observable-Swift.podspec.json rename to Observables-Swift.podspec.json index 7a158b1..535664b 100644 --- a/Observable-Swift.podspec.json +++ b/Observables-Swift.podspec.json @@ -1,7 +1,7 @@ { - "name" : "Observable-Swift", - "module_name" : "Observable", - "version" : "0.5.0", + "name" : "Observables-Swift", + "module_name" : "Observables", + "version" : "0.6.0", "license" : "MIT", "platforms" : { "ios" : "8.0", @@ -13,8 +13,8 @@ "summary" : "KVO for Swift - Value Observing and Events", "source" : { "git" : "https://github.com/slazyk/Observable-Swift.git", - "tag" : "v0.5.0" + "tag" : "v0.6.0" }, - "source_files" : "Observable-Swift/*.swift", + "source_files" : "Observables-Swift/*.swift", "requires_arc" : true } diff --git a/Observable-Swift.xcodeproj/project.pbxproj b/Observables-Swift.xcodeproj/project.pbxproj similarity index 92% rename from Observable-Swift.xcodeproj/project.pbxproj rename to Observables-Swift.xcodeproj/project.pbxproj index 47d336c..5a3f4c6 100644 --- a/Observable-Swift.xcodeproj/project.pbxproj +++ b/Observables-Swift.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 1C93C1351AB0F65D0004FCEF /* Observable-Swift.podspec.json in Resources */ = {isa = PBXBuildFile; fileRef = 1C93C1341AB0F65D0004FCEF /* Observable-Swift.podspec.json */; }; + 1C93C1351AB0F65D0004FCEF /* Observables-Swift.podspec.json in Resources */ = {isa = PBXBuildFile; fileRef = 1C93C1341AB0F65D0004FCEF /* Observables-Swift.podspec.json */; }; 65263AA31954BC5000B39269 /* Observable.h in Headers */ = {isa = PBXBuildFile; fileRef = 65263AA21954BC5000B39269 /* Observable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65263AB01954BC5000B39269 /* ObservableTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65263AAF1954BC5000B39269 /* ObservableTests.swift */; }; 65263ABA1954BC9F00B39269 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65263AB91954BC9F00B39269 /* Observable.swift */; }; @@ -122,8 +122,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 1C93C1341AB0F65D0004FCEF /* Observable-Swift.podspec.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "Observable-Swift.podspec.json"; sourceTree = ""; }; - 65263A9D1954BC5000B39269 /* Observable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1C93C1341AB0F65D0004FCEF /* Observables-Swift.podspec.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = "Observables-Swift.podspec.json"; sourceTree = ""; }; + 65263A9D1954BC5000B39269 /* Observables.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observables.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65263AA11954BC5000B39269 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 65263AA21954BC5000B39269 /* Observable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Observable.h; sourceTree = ""; }; 65263AA81954BC5000B39269 /* Observable Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Observable Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -135,7 +135,7 @@ 65263AC31955004A00B39269 /* ObservableReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObservableReference.swift; sourceTree = ""; }; 65263AC51955D7AE00B39269 /* Event.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Event.swift; sourceTree = ""; }; 65263AC71955D83200B39269 /* EventSubscription.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventSubscription.swift; sourceTree = ""; }; - 6592C2FC1957532100BA8CB7 /* Observable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6592C2FC1957532100BA8CB7 /* Observables.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Observables.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 6592C3061957532100BA8CB7 /* Observable-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Observable-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 65A18B941958C180008E0B44 /* EventReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventReference.swift; sourceTree = ""; }; 65D53669195F711E003B5DA5 /* OwningEventReference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OwningEventReference.swift; sourceTree = ""; }; @@ -178,9 +178,9 @@ 65263A931954BC5000B39269 = { isa = PBXGroup; children = ( - 1C93C1341AB0F65D0004FCEF /* Observable-Swift.podspec.json */, - 65263A9F1954BC5000B39269 /* Observable */, - 65263AAC1954BC5000B39269 /* ObservableTests */, + 1C93C1341AB0F65D0004FCEF /* Observables-Swift.podspec.json */, + 65263A9F1954BC5000B39269 /* Observables */, + 65263AAC1954BC5000B39269 /* ObservablesTests */, 65263A9E1954BC5000B39269 /* Products */, ); sourceTree = ""; @@ -188,15 +188,15 @@ 65263A9E1954BC5000B39269 /* Products */ = { isa = PBXGroup; children = ( - 65263A9D1954BC5000B39269 /* Observable.framework */, + 65263A9D1954BC5000B39269 /* Observables.framework */, 65263AA81954BC5000B39269 /* Observable Tests.xctest */, - 6592C2FC1957532100BA8CB7 /* Observable.framework */, + 6592C2FC1957532100BA8CB7 /* Observables.framework */, 6592C3061957532100BA8CB7 /* Observable-iOS Tests.xctest */, ); name = Products; sourceTree = ""; }; - 65263A9F1954BC5000B39269 /* Observable */ = { + 65263A9F1954BC5000B39269 /* Observables */ = { isa = PBXGroup; children = ( 65263AC11954EBD600B39269 /* Protocols.swift */, @@ -212,8 +212,8 @@ 65263AA21954BC5000B39269 /* Observable.h */, 65263AA01954BC5000B39269 /* Supporting Files */, ); - name = Observable; - path = "Observable-Swift"; + name = Observables; + path = "Observables-Swift"; sourceTree = ""; }; 65263AA01954BC5000B39269 /* Supporting Files */ = { @@ -224,14 +224,14 @@ name = "Supporting Files"; sourceTree = ""; }; - 65263AAC1954BC5000B39269 /* ObservableTests */ = { + 65263AAC1954BC5000B39269 /* ObservablesTests */ = { isa = PBXGroup; children = ( 65263AAF1954BC5000B39269 /* ObservableTests.swift */, 65263AAD1954BC5000B39269 /* Supporting Files */, ); - name = ObservableTests; - path = "Observable-SwiftTests"; + name = ObservablesTests; + path = "Observables-SwiftTests"; sourceTree = ""; }; 65263AAD1954BC5000B39269 /* Supporting Files */ = { @@ -278,8 +278,8 @@ dependencies = ( ); name = Observable; - productName = "Observable-Swift"; - productReference = 65263A9D1954BC5000B39269 /* Observable.framework */; + productName = "Observables-Swift"; + productReference = 65263A9D1954BC5000B39269 /* Observables.framework */; productType = "com.apple.product-type.framework"; }; 65263AA71954BC5000B39269 /* Observable Tests */ = { @@ -300,7 +300,7 @@ 65E7DC681957878C00CFB99C /* PBXTargetDependency */, ); name = "Observable Tests"; - productName = "Observable-SwiftTests"; + productName = "Observables-SwiftTests"; productReference = 65263AA81954BC5000B39269 /* Observable Tests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; @@ -319,7 +319,7 @@ ); name = "Observable-iOS"; productName = "Observable-iOS"; - productReference = 6592C2FC1957532100BA8CB7 /* Observable.framework */; + productReference = 6592C2FC1957532100BA8CB7 /* Observables.framework */; productType = "com.apple.product-type.framework"; }; 6592C3051957532100BA8CB7 /* Observable-iOS Tests */ = { @@ -372,7 +372,7 @@ }; }; }; - buildConfigurationList = 65263A971954BC5000B39269 /* Build configuration list for PBXProject "Observable-Swift" */; + buildConfigurationList = 65263A971954BC5000B39269 /* Build configuration list for PBXProject "Observables-Swift" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -397,7 +397,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1C93C1351AB0F65D0004FCEF /* Observable-Swift.podspec.json in Resources */, + 1C93C1351AB0F65D0004FCEF /* Observables-Swift.podspec.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -634,10 +634,10 @@ COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Observable-Swift/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Observables-Swift/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Observable; + PRODUCT_BUNDLE_IDENTIFIER = com.utdloc.Observables; + PRODUCT_NAME = Observables; SDKROOT = macosx; }; name = Debug; @@ -648,10 +648,10 @@ COMBINE_HIDPI_IMAGES = YES; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Observable-Swift/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Observables-Swift/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Observable; + PRODUCT_BUNDLE_IDENTIFIER = com.utdloc.Observables; + PRODUCT_NAME = Observables; SDKROOT = macosx; }; name = Release; @@ -664,7 +664,7 @@ "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", ); - INFOPLIST_FILE = "Observable-SwiftTests/Info.plist"; + INFOPLIST_FILE = "Observables-SwiftTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -680,7 +680,7 @@ "$(DEVELOPER_FRAMEWORKS_DIR)", "$(inherited)", ); - INFOPLIST_FILE = "Observable-SwiftTests/Info.plist"; + INFOPLIST_FILE = "Observables-SwiftTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -694,11 +694,11 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Observable-Swift/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Observables-SwiftTests/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Observable; + PRODUCT_BUNDLE_IDENTIFIER = com.utdloc.Observables; + PRODUCT_NAME = Observables; SDKROOT = iphoneos; }; name = Debug; @@ -709,11 +709,11 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; - INFOPLIST_FILE = "Observable-Swift/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/Observables-SwiftTests/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Observable; + PRODUCT_BUNDLE_IDENTIFIER = com.utdloc.Observables; + PRODUCT_NAME = Observables; SDKROOT = iphoneos; }; name = Release; @@ -725,7 +725,7 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); - INFOPLIST_FILE = "Observable-SwiftTests/Info.plist"; + INFOPLIST_FILE = "Observables-SwiftTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -740,7 +740,7 @@ "$(SDKROOT)/Developer/Library/Frameworks", "$(inherited)", ); - INFOPLIST_FILE = "Observable-SwiftTests/Info.plist"; + INFOPLIST_FILE = "Observables-SwiftTests/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -751,7 +751,7 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 65263A971954BC5000B39269 /* Build configuration list for PBXProject "Observable-Swift" */ = { + 65263A971954BC5000B39269 /* Build configuration list for PBXProject "Observables-Swift" */ = { isa = XCConfigurationList; buildConfigurations = ( 65263AB11954BC5000B39269 /* Debug */, diff --git a/Observables-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Observables-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e322eff --- /dev/null +++ b/Observables-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme b/Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables-iOS.xcscheme similarity index 84% rename from Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme rename to Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables-iOS.xcscheme index 7cfcd51..2e21d4c 100644 --- a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme +++ b/Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables-iOS.xcscheme @@ -15,9 +15,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -49,7 +49,7 @@ BlueprintIdentifier = "6592C3051957532100BA8CB7" BuildableName = "Observable-iOS Tests.xctest" BlueprintName = "Observable-iOS Tests" - ReferencedContainer = "container:Observable-Swift.xcodeproj"> + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -57,9 +57,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -79,9 +79,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -97,9 +97,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> diff --git a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable.xcscheme b/Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables.xcscheme similarity index 84% rename from Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable.xcscheme rename to Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables.xcscheme index 5bf4b00..ce7fa55 100644 --- a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable.xcscheme +++ b/Observables-Swift.xcodeproj/xcshareddata/xcschemes/Observables.xcscheme @@ -15,9 +15,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -49,7 +49,7 @@ BlueprintIdentifier = "65263AA71954BC5000B39269" BuildableName = "Observable Tests.xctest" BlueprintName = "Observable Tests" - ReferencedContainer = "container:Observable-Swift.xcodeproj"> + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -57,9 +57,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -79,9 +79,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> @@ -97,9 +97,9 @@ + ReferencedContainer = "container:Observables-Swift.xcodeproj"> diff --git a/Observable-Swift/Event.swift b/Observables-Swift/Event.swift similarity index 99% rename from Observable-Swift/Event.swift rename to Observables-Swift/Event.swift index 4796dec..d90c86d 100644 --- a/Observable-Swift/Event.swift +++ b/Observables-Swift/Event.swift @@ -1,6 +1,6 @@ // // Event.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 21/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/EventReference.swift b/Observables-Swift/EventReference.swift similarity index 98% rename from Observable-Swift/EventReference.swift rename to Observables-Swift/EventReference.swift index c402a09..860eec3 100644 --- a/Observable-Swift/EventReference.swift +++ b/Observables-Swift/EventReference.swift @@ -1,6 +1,6 @@ // // EventReference.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 23/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/EventSubscription.swift b/Observables-Swift/EventSubscription.swift similarity index 98% rename from Observable-Swift/EventSubscription.swift rename to Observables-Swift/EventSubscription.swift index 9dc5bb8..4ed25ee 100644 --- a/Observable-Swift/EventSubscription.swift +++ b/Observables-Swift/EventSubscription.swift @@ -1,6 +1,6 @@ // // EventSubscription.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 21/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/Info.plist b/Observables-Swift/Info.plist similarity index 100% rename from Observable-Swift/Info.plist rename to Observables-Swift/Info.plist diff --git a/Observables-Swift/Observable.h b/Observables-Swift/Observable.h new file mode 100644 index 0000000..344d06a --- /dev/null +++ b/Observables-Swift/Observable.h @@ -0,0 +1,19 @@ +// +// Observables-Swift.h +// Observables-Swift +// +// Created by Leszek Ślażyński on 20/06/14. +// Copyright (c) 2014 Leszek Ślażyński. All rights reserved. +// + +#import + +//! Project version number for Observables-Swift. +FOUNDATION_EXPORT double ObservablesVersionNumber; + +//! Project version string for Observables-Swift. +FOUNDATION_EXPORT const unsigned char ObservablesVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Observable-Swift/Observable.swift b/Observables-Swift/Observable.swift similarity index 98% rename from Observable-Swift/Observable.swift rename to Observables-Swift/Observable.swift index cb1682a..6e3eb50 100644 --- a/Observable-Swift/Observable.swift +++ b/Observables-Swift/Observable.swift @@ -1,6 +1,6 @@ // // Observable.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 20/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/ObservableChainingProxy.swift b/Observables-Swift/ObservableChainingProxy.swift similarity index 99% rename from Observable-Swift/ObservableChainingProxy.swift rename to Observables-Swift/ObservableChainingProxy.swift index 8273a57..1c973ea 100644 --- a/Observable-Swift/ObservableChainingProxy.swift +++ b/Observables-Swift/ObservableChainingProxy.swift @@ -1,6 +1,6 @@ // // Chaining.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 23/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/ObservableProxy.swift b/Observables-Swift/ObservableProxy.swift similarity index 98% rename from Observable-Swift/ObservableProxy.swift rename to Observables-Swift/ObservableProxy.swift index 5740f58..91ea42f 100644 --- a/Observable-Swift/ObservableProxy.swift +++ b/Observables-Swift/ObservableProxy.swift @@ -1,6 +1,6 @@ // // ObservableProxy.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 24/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/ObservableReference.swift b/Observables-Swift/ObservableReference.swift similarity index 96% rename from Observable-Swift/ObservableReference.swift rename to Observables-Swift/ObservableReference.swift index 43693ee..7d03be9 100644 --- a/Observable-Swift/ObservableReference.swift +++ b/Observables-Swift/ObservableReference.swift @@ -1,6 +1,6 @@ // // ObservableReference.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 21/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/OwningEventReference.swift b/Observables-Swift/OwningEventReference.swift similarity index 98% rename from Observable-Swift/OwningEventReference.swift rename to Observables-Swift/OwningEventReference.swift index 05a8d40..e473e86 100644 --- a/Observable-Swift/OwningEventReference.swift +++ b/Observables-Swift/OwningEventReference.swift @@ -1,6 +1,6 @@ // // OwningEventReference.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 28/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. @@ -53,4 +53,4 @@ public class OwningEventReference: EventReference { super.init(event: event) } -} \ No newline at end of file +} diff --git a/Observable-Swift/Protocols.swift b/Observables-Swift/Protocols.swift similarity index 99% rename from Observable-Swift/Protocols.swift rename to Observables-Swift/Protocols.swift index 78ccf73..443aa62 100644 --- a/Observable-Swift/Protocols.swift +++ b/Observables-Swift/Protocols.swift @@ -1,6 +1,6 @@ // // Protocols.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 21/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-Swift/TupleObservable.swift b/Observables-Swift/TupleObservable.swift similarity index 99% rename from Observable-Swift/TupleObservable.swift rename to Observables-Swift/TupleObservable.swift index 744de4a..c2f99b6 100644 --- a/Observable-Swift/TupleObservable.swift +++ b/Observables-Swift/TupleObservable.swift @@ -1,6 +1,6 @@ // // TupleObservable.swift -// Observable-Swift +// Observables-Swift // // Created by Leszek Ślażyński on 20/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. diff --git a/Observable-SwiftTests/Info.plist b/Observables-SwiftTests/Info.plist similarity index 100% rename from Observable-SwiftTests/Info.plist rename to Observables-SwiftTests/Info.plist diff --git a/Observable-SwiftTests/ObservableTests.swift b/Observables-SwiftTests/ObservableTests.swift similarity index 99% rename from Observable-SwiftTests/ObservableTests.swift rename to Observables-SwiftTests/ObservableTests.swift index 63c3add..2bf1684 100644 --- a/Observable-SwiftTests/ObservableTests.swift +++ b/Observables-SwiftTests/ObservableTests.swift @@ -1,6 +1,6 @@ // // ObservableTests.swift -// Observable-SwiftTests +// Observables-SwiftTests // // Created by Leszek Ślażyński on 20/06/14. // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. @@ -8,7 +8,7 @@ import XCTest -import Observable +import Observables class ObservableTests: XCTestCase { diff --git a/README.md b/README.md index 6d3ce11..1ce9a41 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Swift lacks the powerful Key Value Observing (KVO) from Objective-C. But thanks ## Overview -Observable-Swift is a Swift library for value observing (via explicit usage of `Observable`) and subscribable events (also explicit, using `Event`). While it is not exactly "KVO for Swift" (it is explicit, there are no "Keys", ...) it is a catchy name so you can call it that if you want. The library is still under development, just as Swift is. Any contributions, both in terms of suggestions/ideas or actual code are welcome. +Observables-Swift is a Swift library for value observing (via explicit usage of `Observable`) and subscribable events (also explicit, using `Event`). While it is not exactly "KVO for Swift" (it is explicit, there are no "Keys", ...) it is a catchy name so you can call it that if you want. The library is still under development, just as Swift is. Any contributions, both in terms of suggestions/ideas or actual code are welcome. -Observable-Swift is brought to you by Leszek Ślażyński (slazyk), you can follow me on [twitter](https://twitter.com/slazyk) and [github](https://github.com/slazyk). +Observables-Swift is brought to you by Leszek Ślażyński (slazyk), you can follow me on [twitter](https://twitter.com/slazyk) and [github](https://github.com/slazyk). Also check out [SINQ](https://github.com/slazyk/SINQ) my other Swift library that makes working with collections a breeze. ### Observables @@ -35,9 +35,9 @@ Under the hood `Observable` uses `beforeChange` and `afterChange` of `EventRe ## Installation -You can use either [CocoaPods](https://cocoapods.org/) or [Carthage](https://github.com/Carthage/Carthage) to install Observable-Swift. +You can use either [CocoaPods](https://cocoapods.org/) or [Carthage](https://github.com/Carthage/Carthage) to install Observables-Swift. -Otherwise, the easiest option to use Observable-Swift in your project is to clone this repo and add Observable-Swift.xcodeproj to your project/workspace and then add Observable.framework to frameworks for your target. +Otherwise, the easiest option to use Observables-Swift in your project is to clone this repo and add Observables-Swift.xcodeproj to your project/workspace and then add Observable.framework to frameworks for your target. After that you just `import Observable`. From c1c2b5c8c1f183678ae721eabeb14ccb7c8f4625 Mon Sep 17 00:00:00 2001 From: Samuel GRAU Date: Fri, 16 Sep 2016 15:35:03 +0200 Subject: [PATCH 3/6] Making Observable-Swift compatible Xcode8/swift3 --- CHANGELOG.md | 0 LICENSE | 0 Observable-Swift.podspec.json | 0 Observable-Swift.xcodeproj/project.pbxproj | 23 +- .../contents.xcworkspacedata | 0 .../xcschemes/Observable-iOS.xcscheme | 2 +- .../xcschemes/Observable.xcscheme | 2 +- Observable-Swift/Event.swift | 116 +++++----- Observable-Swift/EventReference.swift | 20 +- Observable-Swift/EventSubscription.swift | 96 ++++----- Observable-Swift/Info.plist | 0 Observable-Swift/Observable.h | 0 Observable-Swift/Observable.swift | 54 ++--- .../ObservableChainingProxy.swift | 203 +++++++++--------- Observable-Swift/ObservableProxy.swift | 12 +- Observable-Swift/ObservableReference.swift | 28 +-- Observable-Swift/OwningEventReference.swift | 14 +- Observable-Swift/Protocols.swift | 122 +++++------ Observable-Swift/TupleObservable.swift | 8 +- Observable-SwiftTests/Info.plist | 0 Observable-SwiftTests/ObservableTests.swift | 4 +- README.md | 0 22 files changed, 357 insertions(+), 347 deletions(-) mode change 100644 => 100755 CHANGELOG.md mode change 100644 => 100755 LICENSE mode change 100644 => 100755 Observable-Swift.podspec.json mode change 100644 => 100755 Observable-Swift.xcodeproj/project.pbxproj mode change 100644 => 100755 Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata mode change 100644 => 100755 Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme mode change 100644 => 100755 Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable.xcscheme mode change 100644 => 100755 Observable-Swift/Event.swift mode change 100644 => 100755 Observable-Swift/EventReference.swift mode change 100644 => 100755 Observable-Swift/EventSubscription.swift mode change 100644 => 100755 Observable-Swift/Info.plist mode change 100644 => 100755 Observable-Swift/Observable.h mode change 100644 => 100755 Observable-Swift/Observable.swift mode change 100644 => 100755 Observable-Swift/ObservableChainingProxy.swift mode change 100644 => 100755 Observable-Swift/ObservableProxy.swift mode change 100644 => 100755 Observable-Swift/ObservableReference.swift mode change 100644 => 100755 Observable-Swift/OwningEventReference.swift mode change 100644 => 100755 Observable-Swift/Protocols.swift mode change 100644 => 100755 Observable-Swift/TupleObservable.swift mode change 100644 => 100755 Observable-SwiftTests/Info.plist mode change 100644 => 100755 Observable-SwiftTests/ObservableTests.swift mode change 100644 => 100755 README.md diff --git a/CHANGELOG.md b/CHANGELOG.md old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/Observable-Swift.podspec.json b/Observable-Swift.podspec.json old mode 100644 new mode 100755 diff --git a/Observable-Swift.xcodeproj/project.pbxproj b/Observable-Swift.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index 0bcd8be..eec369a --- a/Observable-Swift.xcodeproj/project.pbxproj +++ b/Observable-Swift.xcodeproj/project.pbxproj @@ -359,14 +359,16 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0700; + LastUpgradeCheck = 0800; ORGANIZATIONNAME = "Leszek Ślażyński"; TargetAttributes = { 65263A9C1954BC5000B39269 = { CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 0800; }; 65263AA71954BC5000B39269 = { CreatedOnToolsVersion = 6.0; + LastSwiftMigration = 0800; TestTargetID = 65263A9C1954BC5000B39269; }; 6592C2FB1957532100BA8CB7 = { @@ -560,8 +562,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; @@ -572,6 +576,7 @@ ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -607,8 +612,10 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = YES; @@ -619,6 +626,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -627,6 +635,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 8.0; MACOSX_DEPLOYMENT_TARGET = 10.9; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -645,6 +654,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -659,6 +669,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Release; }; @@ -675,6 +686,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -691,17 +703,18 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = macosx; + SWIFT_VERSION = 3.0; }; name = Release; }; 6592C30F1957532100BA8CB7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Observable-Swift/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; @@ -712,11 +725,11 @@ 6592C3101957532100BA8CB7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Observable-Swift/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; diff --git a/Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Observable-Swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata old mode 100644 new mode 100755 diff --git a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme b/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme old mode 100644 new mode 100755 index 429c264..eb8ed1d --- a/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme +++ b/Observable-Swift.xcodeproj/xcshareddata/xcschemes/Observable-iOS.xcscheme @@ -1,6 +1,6 @@ : UnownableEvent { - public typealias ValueType = T - public typealias SubscriptionType = EventSubscription - public typealias HandlerType = SubscriptionType.HandlerType - - internal var _subscriptions = [SubscriptionType]() - - public init() { - } - - public mutating func notify(value: T) { - _subscriptions = _subscriptions.filter { $0.valid() } - for subscription in _subscriptions { - subscription.handler(value) - } - } - - public mutating func add(subscription: SubscriptionType) -> SubscriptionType { - _subscriptions.append(subscription) - return subscription - } - - public mutating func add(handler : HandlerType) -> SubscriptionType { - return add(SubscriptionType(owner: nil, handler: handler)) - } - - public mutating func remove(subscription : SubscriptionType) { - var newsubscriptions = [SubscriptionType]() - var first = true - for existing in _subscriptions { - if first && existing === subscription { - first = false - } else { - newsubscriptions.append(existing) - } - } - _subscriptions = newsubscriptions - } - - public mutating func removeAll() { - _subscriptions.removeAll() - } - - public mutating func add(owner owner : AnyObject, _ handler : HandlerType) -> SubscriptionType { - return add(SubscriptionType(owner: owner, handler: handler)) + public typealias ValueType = T + public typealias SubscriptionType = EventSubscription + public typealias HandlerType = SubscriptionType.HandlerType + + internal var _subscriptions = [SubscriptionType]() + + public init() { + } + + public mutating func notify(_ value: T) { + _subscriptions = _subscriptions.filter { $0.valid() } + for subscription in _subscriptions { + subscription.handler(value) } - - public mutating func unshare() { -// _subscriptions.unshare() + } + + public mutating func add(_ subscription: SubscriptionType) -> SubscriptionType { + _subscriptions.append(subscription) + return subscription + } + + public mutating func add(_ handler : @escaping HandlerType) -> SubscriptionType { + return add(SubscriptionType(owner: nil, handler: handler)) + } + + public mutating func remove(_ subscription : SubscriptionType) { + var newsubscriptions = [SubscriptionType]() + var first = true + for existing in _subscriptions { + if first && existing === subscription { + first = false + } else { + newsubscriptions.append(existing) + } } - -} + _subscriptions = newsubscriptions + } + + public mutating func removeAll() { + _subscriptions.removeAll() + } + + public mutating func add(owner : AnyObject, _ handler : @escaping HandlerType) -> SubscriptionType { + return add(SubscriptionType(owner: owner, handler: handler)) + } + + public mutating func unshare() { + // _subscriptions.unshare() + } -public func += (inout event: T, handler: T.ValueType -> ()) -> EventSubscription { - return event.add(handler) } -public func += (event: T, handler: T.ValueType -> ()) -> EventSubscription { - var e = event - return e.add(handler) +/*public func += (event: inout T, handler: (T.ValueType) -> ()) -> EventSubscription { + return event.add(handler) +}*/ + +public func += (event: T, handler: @escaping (T.ValueType) -> ()) -> EventSubscription { + var e: T = event + return e.add(handler) } -public func -= (inout event: T, subscription: EventSubscription) { - return event.remove(subscription) +public func -= (event: inout T, subscription: EventSubscription) { + return event.remove(subscription) } public func -= (event: T, subscription: EventSubscription) { - var e = event - return e.remove(subscription) + var e = event + return e.remove(subscription) } diff --git a/Observable-Swift/EventReference.swift b/Observable-Swift/EventReference.swift old mode 100644 new mode 100755 index c402a09..38386ff --- a/Observable-Swift/EventReference.swift +++ b/Observable-Swift/EventReference.swift @@ -7,34 +7,34 @@ // /// A class enclosing an Event struct. Thus exposing it as a reference type. -public class EventReference: OwnableEvent { +open class EventReference: OwnableEvent { public typealias ValueType = T public typealias SubscriptionType = EventSubscription public typealias HandlerType = EventSubscription.HandlerType internal var event: Event - public func notify(value: T) { + open func notify(_ value: T) { event.notify(value) } - public func add(subscription: SubscriptionType) -> SubscriptionType { + open func add(_ subscription: SubscriptionType) -> SubscriptionType { return event.add(subscription) } - public func add(handler : T -> ()) -> EventSubscription { + open func add(_ handler : @escaping (T) -> ()) -> EventSubscription { return event.add(handler) - } - - public func remove(subscription : SubscriptionType) { + } + + open func remove(_ subscription : SubscriptionType) { return event.remove(subscription) } - public func removeAll() { + open func removeAll() { event.removeAll() } - public func add(owner owner : AnyObject, _ handler : HandlerType) -> SubscriptionType { + open func add(owner : AnyObject, _ handler : @escaping HandlerType) -> SubscriptionType { return event.add(owner: owner, handler) } @@ -46,4 +46,4 @@ public class EventReference: OwnableEvent { self.event = event } -} \ No newline at end of file +} diff --git a/Observable-Swift/EventSubscription.swift b/Observable-Swift/EventSubscription.swift old mode 100644 new mode 100755 index 9dc5bb8..cc2f64b --- a/Observable-Swift/EventSubscription.swift +++ b/Observable-Swift/EventSubscription.swift @@ -17,53 +17,53 @@ // Invalidation immediately frees handler and owned objects. /// A class representing a subscription for `Event`. -public class EventSubscription { - - public typealias HandlerType = T -> () - - internal var _valid : () -> Bool - - /// Handler to be caled when value changes. - internal var handler : HandlerType - - /// array of owned objects - internal var _owned = [AnyObject]() - - /// When invalid subscription is to be notified, it is removed instead. - public func valid() -> Bool { - if !_valid() { - invalidate() - return false - } else { - return true - } - } - - /// Marks the event for removal, frees the handler and owned objects - public func invalidate() { - _valid = { false } - handler = { _ in () } - _owned = [] - } - - /// Init with a handler and an optional owner. - /// If owner is present, valid() is tied to its lifetime. - public init(owner o: AnyObject?, handler h: HandlerType) { - if o == nil { - _valid = { true } - } else { - _valid = { [weak o] in o != nil } - } - handler = h - } - - /// Add an object to be owned while the event is not invalidated - public func addOwnedObject(o: AnyObject) { - _owned.append(o) +open class EventSubscription { + + public typealias HandlerType = (T) -> () + + internal var _valid : () -> Bool + + /// Handler to be caled when value changes. + internal var handler : HandlerType + + /// array of owned objects + internal var _owned = [AnyObject]() + + /// When invalid subscription is to be notified, it is removed instead. + open func valid() -> Bool { + if !_valid() { + invalidate() + return false + } else { + return true } - - /// Remove object from owned objects - public func removeOwnedObject(o: AnyObject) { - _owned = _owned.filter{ $0 !== o } + } + + /// Marks the event for removal, frees the handler and owned objects + open func invalidate() { + _valid = { false } + handler = { _ in () } + _owned = [] + } + + /// Init with a handler and an optional owner. + /// If owner is present, valid() is tied to its lifetime. + public init(owner o: AnyObject?, handler h: @escaping HandlerType) { + if o == nil { + _valid = { true } + } else { + _valid = { [weak o] in o != nil } } -} \ No newline at end of file + handler = h + } + + /// Add an object to be owned while the event is not invalidated + open func addOwnedObject(_ o: AnyObject) { + _owned.append(o) + } + + /// Remove object from owned objects + open func removeOwnedObject(_ o: AnyObject) { + _owned = _owned.filter{ $0 !== o } + } +} diff --git a/Observable-Swift/Info.plist b/Observable-Swift/Info.plist old mode 100644 new mode 100755 diff --git a/Observable-Swift/Observable.h b/Observable-Swift/Observable.h old mode 100644 new mode 100755 diff --git a/Observable-Swift/Observable.swift b/Observable-Swift/Observable.swift old mode 100644 new mode 100755 index cb1682a..d8508b2 --- a/Observable-Swift/Observable.swift +++ b/Observable-Swift/Observable.swift @@ -8,42 +8,42 @@ /// A struct representing information associated with value change event. public struct ValueChange { - public let oldValue: T - public let newValue: T - public init(_ o: T, _ n: T) { - oldValue = o - newValue = n - } + public let oldValue: T + public let newValue: T + public init(_ o: T, _ n: T) { + oldValue = o + newValue = n + } } // Implemented as a struct in order to have desired value and mutability sementics. /// A struct representing an observable value. public struct Observable : UnownableObservable { - - public typealias ValueType = T - public /*internal(set)*/ var beforeChange = EventReference>() - public /*internal(set)*/ var afterChange = EventReference>() - - public var value : T { + public typealias ValueType = T + + public var beforeChange = EventReference>() + public var afterChange = EventReference>() + + public var value : T { willSet { beforeChange.notify(ValueChange(value, newValue)) } didSet { afterChange.notify(ValueChange(oldValue, value)) } - } - - public mutating func unshare(removeSubscriptions removeSubscriptions: Bool) { - if removeSubscriptions { - beforeChange = EventReference>() - afterChange = EventReference>() - } else { - beforeChange = EventReference>(event: beforeChange.event) - beforeChange.event.unshare() - afterChange = EventReference>(event: afterChange.event) - afterChange.event.unshare() - } - } + } - public init(_ v : T) { - value = v + public mutating func unshare(removeSubscriptions: Bool) { + if removeSubscriptions { + beforeChange = EventReference>() + afterChange = EventReference>() + } else { + beforeChange = EventReference>(event: beforeChange.event) + beforeChange.event.unshare() + afterChange = EventReference>(event: afterChange.event) + afterChange.event.unshare() } + } + + public init(_ v : T) { + value = v + } } diff --git a/Observable-Swift/ObservableChainingProxy.swift b/Observable-Swift/ObservableChainingProxy.swift old mode 100644 new mode 100755 index 8273a57..cd5e287 --- a/Observable-Swift/ObservableChainingProxy.swift +++ b/Observable-Swift/ObservableChainingProxy.swift @@ -6,121 +6,122 @@ // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. // -public class ObservableChainingProxy: OwnableObservable { - - public typealias ValueType = O2.ValueType? - - public var value : ValueType { return nil } - - internal weak var _beforeChange : EventReference>? = nil - internal weak var _afterChange : EventReference>? = nil - - public var beforeChange : EventReference> { - if let event = _beforeChange { - return event - } else { - let event = OwningEventReference>() - event.owned = self - _beforeChange = event - return event - } +open class ObservableChainingProxy: OwnableObservable { + + public typealias ValueType = O2.ValueType? + + open var value : ValueType { return nil } + + internal weak var _beforeChange : EventReference>? = nil + internal weak var _afterChange : EventReference>? = nil + + public var beforeChange : EventReference> { + if let event = _beforeChange { + return event + } else { + let event = OwningEventReference>() + event.owned = self + _beforeChange = event + return event } - - public var afterChange : EventReference> { - if let event = _afterChange { - return event - } else { - let event = OwningEventReference>() - event.owned = self - _afterChange = event - return event - } + } + + public var afterChange : EventReference> { + if let event = _afterChange { + return event + } else { + let event = OwningEventReference>() + event.owned = self + _afterChange = event + return event } - - internal let base: O1 - internal let path: O1.ValueType -> O2? - - private func targetChangeToValueChange(vc: ValueChange) -> ValueChange { - let oldValue = Optional.Some(vc.oldValue) - let newValue = Optional.Some(vc.newValue) - return ValueChange(oldValue, newValue) + } + + internal let base: O1 + internal let path: (O1.ValueType) -> O2? + + fileprivate func targetChangeToValueChange(_ vc: ValueChange) -> ValueChange { + let oldValue = Optional.some(vc.oldValue) + let newValue = Optional.some(vc.newValue) + return ValueChange(oldValue, newValue) + } + + fileprivate func objectChangeToValueChange(_ oc: ValueChange) -> ValueChange { + let oldValue = path(oc.oldValue)?.value + let newValue = path(oc.newValue)?.value + return ValueChange(oldValue, newValue) + } + + init(base: O1, path: @escaping (O1.ValueType) -> O2?) { + self.base = base + self.path = path + + let beforeSubscription = EventSubscription(owner: self) { [weak self] in + self!.beforeChange.notify(self!.targetChangeToValueChange($0)) } - - private func objectChangeToValueChange(oc: ValueChange) -> ValueChange { - let oldValue = path(oc.oldValue)?.value - let newValue = path(oc.newValue)?.value - return ValueChange(oldValue, newValue) + + let afterSubscription = EventSubscription(owner: self) { [weak self] in + self!.afterChange.notify(self!.targetChangeToValueChange($0)) } - - init(base: O1, path: O1.ValueType -> O2?) { - self.base = base - self.path = path - - let beforeSubscription = EventSubscription(owner: self) { [weak self] in - self!.beforeChange.notify(self!.targetChangeToValueChange($0)) - } - - let afterSubscription = EventSubscription(owner: self) { [weak self] in - self!.afterChange.notify(self!.targetChangeToValueChange($0)) - } - - base.beforeChange.add(owner: self) { [weak self] oc in - let oldTarget = path(oc.oldValue) - oldTarget?.beforeChange.remove(beforeSubscription) - oldTarget?.afterChange.remove(afterSubscription) - self!.beforeChange.notify(self!.objectChangeToValueChange(oc)) - } - - base.afterChange.add(owner: self) { [weak self] oc in - self!.afterChange.notify(self!.objectChangeToValueChange(oc)) - let newTarget = path(oc.newValue) - newTarget?.beforeChange.add(beforeSubscription) - newTarget?.afterChange.add(afterSubscription) - } + + base.beforeChange.add(owner: self) { [weak self] oc in + let oldTarget = path(oc.oldValue) + oldTarget?.beforeChange.remove(beforeSubscription) + oldTarget?.afterChange.remove(afterSubscription) + self!.beforeChange.notify(self!.objectChangeToValueChange(oc)) } - - public func to(path f: O2.ValueType -> O3?) -> ObservableChainingProxy, O3> { - func cascadeNil(oOrNil: ValueType) -> O3? { - if let o = oOrNil { - return f(o) - } else { - return nil - } - } - return ObservableChainingProxy, O3>(base: self, path: cascadeNil) + + base.afterChange.add(owner: self) { [weak self] oc in + self!.afterChange.notify(self!.objectChangeToValueChange(oc)) + let newTarget = path(oc.newValue) + newTarget?.beforeChange.add(beforeSubscription) + newTarget?.afterChange.add(afterSubscription) } - - public func to(path f: O2.ValueType -> O3) -> ObservableChainingProxy, O3> { - func cascadeNil(oOrNil: ValueType) -> O3? { - if let o = oOrNil { - return f(o) - } else { - return nil - } - } - return ObservableChainingProxy, O3>(base: self, path: cascadeNil) + } + + open func to(path f: @escaping (O2.ValueType) -> O3?) -> ObservableChainingProxy, O3> { + func cascadeNil(_ oOrNil: ValueType) -> O3? { + if let o = oOrNil { + return f(o) + } else { + return nil + } } - + return ObservableChainingProxy, O3>(base: self, path: cascadeNil) + } + + open func to(path f: @escaping (O2.ValueType) -> O3) -> ObservableChainingProxy, O3> { + func cascadeNil(_ oOrNil: ValueType) -> O3? { + if let o = oOrNil { + return f(o) + } else { + return nil + } + } + return ObservableChainingProxy, O3>(base: self, path: cascadeNil) + } + } public struct ObservableChainingBase { - internal let base: O1 - public func to(path: O1.ValueType -> O2?) -> ObservableChainingProxy { - return ObservableChainingProxy(base: base, path: path) - } - public func to(path: O1.ValueType -> O2) -> ObservableChainingProxy { - return ObservableChainingProxy(base: base, path: { .Some(path($0)) }) - } + internal let base: O1 + public func to(_ path: @escaping (O1.ValueType) -> O2?) -> ObservableChainingProxy { + return ObservableChainingProxy(base: base, path: path) + } + public func to(_ path: @escaping (O1.ValueType) -> O2) -> ObservableChainingProxy { + return ObservableChainingProxy(base: base, path: { .some(path($0)) }) + } } -public func chain(o: O) -> ObservableChainingBase { - return ObservableChainingBase(base: o) +public func chain(_ o: O) -> ObservableChainingBase { + return ObservableChainingBase(base: o) } -public func / (o: ObservableChainingProxy, f: O2.ValueType -> O3?) -> ObservableChainingProxy, O3> { - return o.to(path: f) +public func / (o: ObservableChainingProxy, f: @escaping (O2.ValueType) -> O3?) + -> ObservableChainingProxy, O3> { + return o.to(path: f) } -public func / (o: O1, f: O1.ValueType -> O2?) -> ObservableChainingProxy { - return ObservableChainingProxy(base: o, path: f) +public func / (o: O1, f: @escaping (O1.ValueType) -> O2?) -> ObservableChainingProxy { + return ObservableChainingProxy(base: o, path: f) } diff --git a/Observable-Swift/ObservableProxy.swift b/Observable-Swift/ObservableProxy.swift old mode 100644 new mode 100755 index 5740f58..a54fa54 --- a/Observable-Swift/ObservableProxy.swift +++ b/Observable-Swift/ObservableProxy.swift @@ -8,17 +8,17 @@ // two generic parameters are needed to be able to override `value` in `ObservableReference` -public class ObservableProxy : OwnableObservable { +open class ObservableProxy : OwnableObservable where O.ValueType == T { public typealias ValueType = T - public /*internal(set)*/ var beforeChange = EventReference>() - public /*internal(set)*/ var afterChange = EventReference>() + open var beforeChange = EventReference>() + open var afterChange = EventReference>() // private storage in case subclasses override value with a setter - private var _value : T + fileprivate var _value : T - public var value : T { + open var value : T { return _value } @@ -36,6 +36,6 @@ public class ObservableProxy : Ownab } -public func proxy (o: O) -> ObservableProxy { +public func proxy (_ o: O) -> ObservableProxy { return ObservableProxy(o) } diff --git a/Observable-Swift/ObservableReference.swift b/Observable-Swift/ObservableReference.swift old mode 100644 new mode 100755 index 43693ee..df776b3 --- a/Observable-Swift/ObservableReference.swift +++ b/Observable-Swift/ObservableReference.swift @@ -6,20 +6,20 @@ // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. // -public class ObservableReference : ObservableProxy>, WritableObservable { - - public typealias ValueType = T - - internal var storage : Observable - - public override var value: T { +open class ObservableReference : ObservableProxy>, WritableObservable { + + public typealias ValueType = T + + internal var storage : Observable + + open override var value: T { get { return storage.value } set { storage.value = newValue } - } - - public init (_ v : T) { - storage = Observable(v) - super.init(storage) - } - + } + + public init (_ v : T) { + storage = Observable(v) + super.init(storage) + } + } diff --git a/Observable-Swift/OwningEventReference.swift b/Observable-Swift/OwningEventReference.swift old mode 100644 new mode 100755 index 05a8d40..60d3e0d --- a/Observable-Swift/OwningEventReference.swift +++ b/Observable-Swift/OwningEventReference.swift @@ -9,11 +9,11 @@ /// A subclass of event reference allowing it to own other object[s]. /// Additionally, the reference makes added events own itself. /// This retain cycle allows owned objects to live as long as valid subscriptions exist. -public class OwningEventReference: EventReference { +open class OwningEventReference: EventReference { internal var owned: AnyObject? = nil - public override func add(subscription: SubscriptionType) -> SubscriptionType { + open override func add(_ subscription: SubscriptionType) -> SubscriptionType { let subscr = super.add(subscription) if owned != nil { subscr.addOwnedObject(self) @@ -21,7 +21,7 @@ public class OwningEventReference: EventReference { return subscr } - public override func add(handler : T -> ()) -> EventSubscription { + open override func add(_ handler : @escaping (T) -> ()) -> EventSubscription { let subscr = super.add(handler) if owned != nil { subscr.addOwnedObject(self) @@ -29,19 +29,19 @@ public class OwningEventReference: EventReference { return subscr } - public override func remove(subscription : SubscriptionType) { + open override func remove(_ subscription : SubscriptionType) { subscription.removeOwnedObject(self) return event.remove(subscription) } - public override func removeAll() { + open override func removeAll() { for subscription in event._subscriptions { subscription.removeOwnedObject(self) } event.removeAll() } - public override func add(owner owner : AnyObject, _ handler : HandlerType) -> SubscriptionType { + open override func add(owner : AnyObject, _ handler : @escaping HandlerType) -> SubscriptionType { let subscr = event.add(owner: owner, handler) if owned != nil { subscr.addOwnedObject(self) @@ -53,4 +53,4 @@ public class OwningEventReference: EventReference { super.init(event: event) } -} \ No newline at end of file +} diff --git a/Observable-Swift/Protocols.swift b/Observable-Swift/Protocols.swift old mode 100644 new mode 100755 index ca6918d..8878acb --- a/Observable-Swift/Protocols.swift +++ b/Observable-Swift/Protocols.swift @@ -8,63 +8,59 @@ /// Arbitrary Event. public protocol AnyEvent { - - associatedtype ValueType - - /// Notify all valid subscriptions of the change. Remove invalid ones. - mutating func notify(value: ValueType) - - /// Add an existing subscription. - mutating func add(subscription: EventSubscription) -> EventSubscription - - /// Create, add and return a subscription for given handler. - mutating func add(handler : ValueType -> ()) -> EventSubscription - - /// Remove given subscription, if present. - mutating func remove(subscription : EventSubscription) - - /// Remove all subscriptions. - mutating func removeAll() - - /// Create, add and return a subscription with given handler and owner. - mutating func add(owner owner : AnyObject, _ handler : ValueType -> ()) -> EventSubscription -} + associatedtype ValueType -/// Event which is a value type. -public protocol UnownableEvent: AnyEvent { + /// Notify all valid subscriptions of the change. Remove invalid ones. + mutating func notify(_ value: ValueType) -} + /// Add an existing subscription. + mutating func add(_ subscription: EventSubscription) -> EventSubscription -/// Event which is a reference type -public protocol OwnableEvent: AnyEvent { + /// Create, add and return a subscription for given handler. + mutating func add(_ handler: @escaping (ValueType) -> ()) -> EventSubscription + + /// Remove given subscription, if present. + mutating func remove(_ subscription : EventSubscription) + + /// Remove all subscriptions. + mutating func removeAll() + + /// Create, add and return a subscription with given handler and owner. + mutating func add(owner: AnyObject, _ handler: @escaping (ValueType) -> ()) -> EventSubscription } +/// Event which is a value type. +public protocol UnownableEvent: AnyEvent {} + +/// Event which is a reference type +public protocol OwnableEvent: AnyEvent {} + /// Arbitrary observable. public protocol AnyObservable { - - associatedtype ValueType - - /// Value of the observable. - var value : ValueType { get } - - /// Event fired before value is changed - var beforeChange : EventReference> { get } - - /// Event fired after value is changed - var afterChange : EventReference> { get } + + associatedtype ValueType + + /// Value of the observable. + var value : ValueType { get } + + /// Event fired before value is changed + var beforeChange : EventReference> { get } + + /// Event fired after value is changed + var afterChange : EventReference> { get } } /// Observable which can be written to -public protocol WritableObservable : AnyObservable { - var value : ValueType { get set } +public protocol WritableObservable: AnyObservable { + var value : ValueType { get set } } /// Observable which is a value type. Elementary observables are value types. public protocol UnownableObservable : WritableObservable { - /// Unshares events - mutating func unshare(removeSubscriptions removeSubscriptions: Bool) + /// Unshares events + mutating func unshare(removeSubscriptions: Bool) } /// Observable which is a reference type. Compound observables are reference types. @@ -73,57 +69,57 @@ public protocol OwnableObservable : AnyObservable { } // observable <- value -infix operator <- { } +infix operator <- // value = observable^ -postfix operator ^ { } +postfix operator ^ // observable ^= value -public func ^= (inout x: T, y: T.ValueType) { - x.value = y +public func ^= (x: inout T, y: T.ValueType) { + x.value = y } // observable += { valuechange in ... } -public func += (inout x: T, y: ValueChange -> ()) -> EventSubscription> { - return x.afterChange += y +public func += (x: inout T, y: @escaping (ValueChange) -> ()) -> EventSubscription> { + return x.afterChange += y } // observable += { (old, new) in ... } -public func += (inout x: T, y: (T.ValueType, T.ValueType) -> ()) -> EventSubscription> { - return x.afterChange += y +public func += (x: inout T, y: @escaping (T.ValueType, T.ValueType) -> ()) -> EventSubscription> { + return x.afterChange += y } // observable += { new in ... } -public func += (inout x: T, y: T.ValueType -> ()) -> EventSubscription> { - return x.afterChange += y +public func += (x: inout T, y: @escaping (T.ValueType) -> ()) -> EventSubscription> { + return x.afterChange += y } // observable -= subscription -public func -= (inout x: T, s: EventSubscription>) { - x.afterChange.remove(s) +public func -= (x: inout T, s: EventSubscription>) { + x.afterChange.remove(s) } // event += { (old, new) in ... } -public func += (event: EventReference>, handler: (T, T) -> ()) -> EventSubscription> { - return event.add({ handler($0.oldValue, $0.newValue) }) +public func += (event: EventReference>, handler: @escaping (T, T) -> ()) -> EventSubscription> { + return event.add({ handler($0.oldValue, $0.newValue) }) } // event += { new in ... } -public func += (event: EventReference>, handler: T -> ()) -> EventSubscription> { - return event.add({ handler($0.newValue) }) +public func += (event: EventReference>, handler: @escaping (T) -> ()) -> EventSubscription> { + return event.add({ handler($0.newValue) }) } // for observable values on variables -public func <- > (inout x: T, y: T.ValueType) { - x.value = y +public func <- (x: inout T, y: T.ValueType) { + x.value = y } // for observable references on variables or constants -public func <- > (x: T, y: T.ValueType) { - var z = x - z.value = y +public func <- (x: T, y: T.ValueType) { + var z = x + z.value = y } public postfix func ^ (x: T) -> T.ValueType { - return x.value + return x.value } diff --git a/Observable-Swift/TupleObservable.swift b/Observable-Swift/TupleObservable.swift old mode 100644 new mode 100755 index 744de4a..f9d7af3 --- a/Observable-Swift/TupleObservable.swift +++ b/Observable-Swift/TupleObservable.swift @@ -6,20 +6,20 @@ // Copyright (c) 2014 Leszek Ślażyński. All rights reserved. // -public class PairObservable : OwnableObservable { +open class PairObservable : OwnableObservable { internal typealias T1 = O1.ValueType internal typealias T2 = O2.ValueType public typealias ValueType = (T1, T2) - public /*internal(set)*/ var beforeChange = EventReference>() - public /*internal(set)*/ var afterChange = EventReference>() + open /*internal(set)*/ var beforeChange = EventReference>() + open /*internal(set)*/ var afterChange = EventReference>() internal var first : T1 internal var second : T2 - public var value : (T1, T2) { return (first, second) } + open var value : (T1, T2) { return (first, second) } internal let _base1 : O1 internal let _base2 : O2 diff --git a/Observable-SwiftTests/Info.plist b/Observable-SwiftTests/Info.plist old mode 100644 new mode 100755 diff --git a/Observable-SwiftTests/ObservableTests.swift b/Observable-SwiftTests/ObservableTests.swift old mode 100644 new mode 100755 index 63c3add..0018a40 --- a/Observable-SwiftTests/ObservableTests.swift +++ b/Observable-SwiftTests/ObservableTests.swift @@ -14,7 +14,7 @@ class ObservableTests: XCTestCase { // copying an observable is exposed here as a function in case it changes // e.g. if Observables become classes instead of structs - func makeCopy(x: Observable) -> Observable { + func makeCopy(_ x: Observable) -> Observable { var copy = Observable(x^) copy.unshare(removeSubscriptions: true) return copy @@ -108,7 +108,7 @@ class ObservableTests: XCTestCase { func testAddHandlerToOptional() { var original = Observable(0) - let optional = Optional.Some(original) + let optional = Optional.some(original) var calledTimes = 0 optional!.afterChange.add({ _ in calledTimes += 1 }) diff --git a/README.md b/README.md old mode 100644 new mode 100755 From e6d712dd7fc7a7dfac5457e9e122dcf040839811 Mon Sep 17 00:00:00 2001 From: Samuel GRAU Date: Fri, 16 Sep 2016 15:55:47 +0200 Subject: [PATCH 4/6] Specifying swift legacy value for iOS target --- Observable-Swift.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Observable-Swift.xcodeproj/project.pbxproj b/Observable-Swift.xcodeproj/project.pbxproj index eec369a..a2b83e6 100755 --- a/Observable-Swift.xcodeproj/project.pbxproj +++ b/Observable-Swift.xcodeproj/project.pbxproj @@ -719,6 +719,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; SDKROOT = iphoneos; + SWIFT_VERSION = 3.0; }; name = Debug; }; @@ -734,6 +735,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.utdloc.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = Observable; SDKROOT = iphoneos; + SWIFT_VERSION = 3.0; }; name = Release; }; From 16df73b73281dd5f3d72de27c32472115c56d509 Mon Sep 17 00:00:00 2001 From: Florian Denis Date: Tue, 17 Oct 2017 10:30:52 +0200 Subject: [PATCH 5/6] Fix warnings when compiling with Xcode 9 / Swift 3 & 4 --- Observable-Swift/ObservableChainingProxy.swift | 4 ++-- Observable-Swift/TupleObservable.swift | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Observable-Swift/ObservableChainingProxy.swift b/Observable-Swift/ObservableChainingProxy.swift index 50ee307..88a1ddb 100644 --- a/Observable-Swift/ObservableChainingProxy.swift +++ b/Observable-Swift/ObservableChainingProxy.swift @@ -117,10 +117,10 @@ public func chain(_ o: O) -> ObservableChainingBase { return ObservableChainingBase(base: o) } -public func / (o: ObservableChainingProxy, f: @escaping (O2.ValueType) -> O3?) -> ObservableChainingProxy, O3> { +public func / (o: ObservableChainingProxy, f: @escaping (O2.ValueType) -> O3?) -> ObservableChainingProxy, O3> { return o.to(path: f) } -public func / (o: O1, f: @escaping (O1.ValueType) -> O2?) -> ObservableChainingProxy { +public func / (o: O1, f: @escaping (O1.ValueType) -> O2?) -> ObservableChainingProxy { return ObservableChainingProxy(base: o, path: f) } diff --git a/Observable-Swift/TupleObservable.swift b/Observable-Swift/TupleObservable.swift index 665f0ea..3d0cc13 100644 --- a/Observable-Swift/TupleObservable.swift +++ b/Observable-Swift/TupleObservable.swift @@ -11,7 +11,7 @@ public class PairObservable : OwnableObser internal typealias T1 = O1.ValueType internal typealias T2 = O2.ValueType - public typealias ValueType = (T1, T2) + public typealias ValueType = (O1.ValueType, O2.ValueType) public private(set) var beforeChange = EventReference>() public private(set) var afterChange = EventReference>() @@ -19,7 +19,7 @@ public class PairObservable : OwnableObser internal var first : T1 internal var second : T2 - public var value : (T1, T2) { return (first, second) } + public var value : ValueType { return (first, second) } private let _base1 : O1 private let _base2 : O2 From 8e2a51f985b80af35e589bdea3a1194391097f9b Mon Sep 17 00:00:00 2001 From: Florian Denis Date: Tue, 16 Oct 2018 17:10:18 +0200 Subject: [PATCH 6/6] Swift errors when compiling with Swift 4.2 --- Observable-Swift/TupleObservable.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Observable-Swift/TupleObservable.swift b/Observable-Swift/TupleObservable.swift index 3d0cc13..249a2ca 100644 --- a/Observable-Swift/TupleObservable.swift +++ b/Observable-Swift/TupleObservable.swift @@ -13,8 +13,8 @@ public class PairObservable : OwnableObser public typealias ValueType = (O1.ValueType, O2.ValueType) - public private(set) var beforeChange = EventReference>() - public private(set) var afterChange = EventReference>() + public private(set) var beforeChange = EventReference>() + public private(set) var afterChange = EventReference>() internal var first : T1 internal var second : T2