Skip to content

Commit

Permalink
Add Swift Package Manager support (#57)
Browse files Browse the repository at this point in the history
* Move UIBarButtonItem into iOS folder
* Add Swift Package Manager support
* Add Swift Package Manager instructions to readme
  • Loading branch information
LinusU authored and artman committed Mar 31, 2018
1 parent d9c39d2 commit d6bfec3
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 40 deletions.
11 changes: 10 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription

let package = Package(
name: "Signals"
name: "Signals",
products: [
.library(name: "Signals", targets: ["Signals"]),
],
targets: [
.target(name: "Signals", path: "Signals"),
.testTarget(name: "SignalsTests", dependencies: ["Signals"]),
]
)
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,16 @@ To integrate Signals into your project using Carthage add the following to your
github "artman/Signals" ~> 5.0
```

#### Swift Package Manager

To integrate Signals into your project using SwiftPM add the following to your `Package.swift`:

```swift
dependencies: [
.package(url: "https://github.com/artman/Signals", from: "5.0"),
],
```

## Quick start

Make events on a class observable by creating one or more signals:
Expand Down Expand Up @@ -127,7 +137,7 @@ self.onData.fire((data:receivedData, error:receivedError))

// You can use the => operator to fire the signal
self.onData => (data:receivedData, error:receivedError)

// Also works for signals without tuples
self.onProgress => 1.0
```
Expand Down
2 changes: 1 addition & 1 deletion Signals.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
/* End PBXContainerItemProxy section */

/* Begin PBXFileReference section */
158A3F142052EE8E00174952 /* UIBarButtonItem+Signals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIBarButtonItem+Signals.swift"; sourceTree = "<group>"; };
158A3F142052EE8E00174952 /* UIBarButtonItem+Signals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = "UIBarButtonItem+Signals.swift"; path = "ios/UIBarButtonItem+Signals.swift"; sourceTree = "<group>"; };
720D11721A085314003C4361 /* Signals.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Signals.framework; sourceTree = BUILT_PRODUCTS_DIR; };
720D11761A085315003C4361 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
720D11771A085315003C4361 /* Signals.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Signals.h; sourceTree = "<group>"; };
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
// Copyright © 2018 Tuomas Artman. All rights reserved.
//

#if os(iOS) || os(tvOS)

import UIKit

/// Extends UIBarButtonItem with signal for the action.
Expand Down Expand Up @@ -40,3 +42,5 @@ public extension UIBarButtonItem {
getOrCreateSignal().fire(())
}
}

#endif
70 changes: 37 additions & 33 deletions Signals/ios/UIControl+Signals.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Copyright (c) 2014 - 2017 Tuomas Artman. All rights reserved.
//

#if os(iOS) || os(tvOS)

import UIKit

/// Extends UIControl with signals for all ui control events.
Expand All @@ -10,78 +12,78 @@ public extension UIControl {
public var onTouchDown: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDown);
}

/// A signal that fires for each touch down repeat control event.
public var onTouchDownRepeat: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDownRepeat);
}

/// A signal that fires for each touch drag inside control event.
public var onTouchDragInside: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDragInside);
}

/// A signal that fires for each touch drag outside control event.
public var onTouchDragOutside: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDragOutside);
}

/// A signal that fires for each touch drag enter control event.
public var onTouchDragEnter: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDragEnter);
}

/// A signal that fires for each touch drag exit control event.
public var onTouchDragExit: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchDragExit);
}

/// A signal that fires for each touch up inside control event.
public var onTouchUpInside: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchUpInside);
}

/// A signal that fires for each touch up outside control event.
public var onTouchUpOutside: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchUpOutside);
}

/// A signal that fires for each touch cancel control event.
public var onTouchCancel: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.touchCancel);
}

/// A signal that fires for each value changed control event.
public var onValueChanged: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.valueChanged);
}

/// A signal that fires for each editing did begin control event.
public var onEditingDidBegin: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.editingDidBegin);
}

/// A signal that fires for each editing changed control event.
public var onEditingChanged: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.editingChanged);
}

/// A signal that fires for each editing did end control event.
public var onEditingDidEnd: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.editingDidEnd);
}

/// A signal that fires for each editing did end on exit control event.
public var onEditingDidEndOnExit: Signal<(Void)> {
return getOrCreateSignalForUIControlEvent(.editingDidEndOnExit);
}

// MARK: - Private interface

private struct AssociatedKeys {
static var SignalDictionaryKey = "signals_signalKey"
}

private static let eventToKey: [UIControlEvents: NSString] = [
.touchDown: "TouchDown",
.touchDownRepeat: "TouchDownRepeat",
Expand All @@ -97,14 +99,14 @@ public extension UIControl {
.editingChanged: "EditingChanged",
.editingDidEnd: "EditingDidEnd",
.editingDidEndOnExit: "EditingDidEndOnExit"]

private func getOrCreateSignalForUIControlEvent(_ event: UIControlEvents) -> Signal<(Void)> {
guard let key = UIControl.eventToKey[event] else {
assertionFailure("Event type is not handled")
return Signal()
}
let dictionary = getOrCreateAssociatedObject(self, associativeKey: &AssociatedKeys.SignalDictionaryKey, defaultValue: NSMutableDictionary(), policy: objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)

if let signal = dictionary[key] as? Signal<()> {
return signal
} else {
Expand All @@ -114,63 +116,63 @@ public extension UIControl {
return signal
}
}

private func handleUIControlEvent(_ uiControlEvent: UIControlEvents) {
getOrCreateSignalForUIControlEvent(uiControlEvent).fire(())
}

@objc private dynamic func eventHandlerTouchDown() {
handleUIControlEvent(.touchDown)
}

@objc private dynamic func eventHandlerTouchDownRepeat() {
handleUIControlEvent(.touchDownRepeat)
}

@objc private dynamic func eventHandlerTouchDragInside() {
handleUIControlEvent(.touchDragInside)
}

@objc private dynamic func eventHandlerTouchDragOutside() {
handleUIControlEvent(.touchDragOutside)
}

@objc private dynamic func eventHandlerTouchDragEnter() {
handleUIControlEvent(.touchDragEnter)
}

@objc private dynamic func eventHandlerTouchDragExit() {
handleUIControlEvent(.touchDragExit)
}

@objc private dynamic func eventHandlerTouchUpInside() {
handleUIControlEvent(.touchUpInside)
}

@objc private dynamic func eventHandlerTouchUpOutside() {
handleUIControlEvent(.touchUpOutside)
}

@objc private dynamic func eventHandlerTouchCancel() {
handleUIControlEvent(.touchCancel)
}

@objc private dynamic func eventHandlerValueChanged() {
handleUIControlEvent(.valueChanged)
}

@objc private dynamic func eventHandlerEditingDidBegin() {
handleUIControlEvent(.editingDidBegin)
}

@objc private dynamic func eventHandlerEditingChanged() {
handleUIControlEvent(.editingChanged)
}

@objc private dynamic func eventHandlerEditingDidEnd() {
handleUIControlEvent(.editingDidEnd)
}

@objc private dynamic func eventHandlerEditingDidEndOnExit() {
handleUIControlEvent(.editingDidEndOnExit)
}
Expand All @@ -181,3 +183,5 @@ extension UIControlEvents: Hashable {
return Int(self.rawValue)
}
}

#endif
12 changes: 8 additions & 4 deletions SignalsTests/UIControl+SignalsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
// Copyright (c) 2014 - 2017 Tuomas Artman. All rights reserved.
//

#if os(iOS) || os(tvOS)

import XCTest
import Signals

Expand Down Expand Up @@ -66,12 +68,12 @@ class UIControl_SignalsTests: XCTestCase {
button.onEditingDidEndOnExit.subscribe(with: self) { _ in
onEditingDidEndOnExitCount += 1
}
let events: [UIControlEvents] = [.touchDown, .touchDownRepeat, .touchDragInside, .touchDragOutside,
.touchDragEnter, .touchDragExit, .touchUpInside, .touchUpOutside,

let events: [UIControlEvents] = [.touchDown, .touchDownRepeat, .touchDragInside, .touchDragOutside,
.touchDragEnter, .touchDragExit, .touchUpInside, .touchUpOutside,
.touchCancel, .valueChanged, .editingDidBegin, .editingChanged,
.editingDidEnd, .editingDidEndOnExit];

for event in events {
let actions = button.actions(forTarget: button, forControlEvent: event);
for action in actions! {
Expand All @@ -95,3 +97,5 @@ class UIControl_SignalsTests: XCTestCase {
XCTAssertEqual(onEditingDidEndOnExitCount, 1, "Should have triggered once")
}
}

#endif

0 comments on commit d6bfec3

Please sign in to comment.