Commit f4aaa892 authored by Aral Balkan's avatar Aral Balkan

Update master to Swift 3

parents 95b43a46 d415a86f
......@@ -149,14 +149,16 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 0730;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Aral Balkan";
TargetAttributes = {
A7C0EAFF1C23511000110179 = {
CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
};
A7C0EB091C23511000110179 = {
CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
};
};
};
......@@ -237,8 +239,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;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
......@@ -287,8 +291,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;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
......@@ -329,6 +335,7 @@
INFOPLIST_FILE = Handle/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = ind.ie.Handle;
PRODUCT_NAME = "$(TARGET_NAME)";
......@@ -336,6 +343,7 @@
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 3.0;
VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64";
};
name = Debug;
......@@ -352,12 +360,15 @@
INFOPLIST_FILE = Handle/Info.plist;
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
ONLY_ACTIVE_ARCH = NO;
MACOSX_DEPLOYMENT_TARGET = 10.11;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = ind.ie.Handle;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64";
};
name = Release;
......@@ -374,6 +385,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = ind.ie.HandleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
......@@ -389,6 +401,8 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks @executable_path/../Frameworks @loader_path/../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = ind.ie.HandleTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
};
name = Release;
};
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0730"
LastUpgradeVersion = "0800"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
......
......@@ -11,13 +11,13 @@
import Foundation
let 📡:NSNotificationCenter = NSNotificationCenter.defaultCenter()
let 📡:NotificationCenter = NotificationCenter.default
public typealias NotificationBlock = (NSNotification!) -> Void
public typealias NotificationBlock = (Notification!) -> Void
// Utility method: destroy a notification handler
public func destroyNotificationHandler(inout handler:NotificationHandler?)
public func destroyNotificationHandler(_ handler:inout NotificationHandler?)
{
handler?.remove()
handler = nil
......@@ -33,12 +33,12 @@ public class NotificationHandler:NSObject
{
var handler:NotificationBlock
init(handler:NotificationBlock)
init(handler:@escaping NotificationBlock)
{
self.handler = handler
}
public func handlerProxy(notification:NSNotification!)
public func handlerProxy(_ notification:Notification!)
{
handler(notification)
}
......@@ -69,22 +69,22 @@ public class NotificationHandler:NSObject
//
public func handle(notificationName:String, with block:NotificationBlock) -> NotificationHandler
public func handle(_ notificationName:String, with block:@escaping NotificationBlock) -> NotificationHandler
{
//
// Instead of using the block-based methods of NSNotificationCenter, create an observer
// object and return that for easy removing of the observer, etc.
//
let observer = NotificationHandler(handler: block)
📡.addObserver(observer, selector: #selector(observer.handlerProxy(_:)), name: notificationName, object: nil)
📡.addObserver(observer, selector: #selector(observer.handlerProxy(_:)), name: NSNotification.Name(rawValue: notificationName), object: nil)
return observer
}
public func handle(notificationName:String, from object:AnyObject?, with block:NotificationBlock) -> NotificationHandler
public func handle(_ notificationName:String, from object:Any?, with block:@escaping NotificationBlock) -> NotificationHandler
{
let observer = NotificationHandler(handler: block)
📡.addObserver(observer, selector: #selector(observer.handlerProxy(_:)), name: notificationName, object: object)
📡.addObserver(observer, selector: #selector(observer.handlerProxy(_:)), name: NSNotification.Name(rawValue: notificationName), object: object)
return observer
}
......@@ -94,20 +94,20 @@ public func handle(notificationName:String, from object:AnyObject?, with block:N
//
public func post(notificationName:String, from object:AnyObject?, with userInfo:[NSObject : AnyObject]?)
public func post(_ notificationName:String, from object:Any?, with userInfo:[AnyHashable:Any]?)
{
// println("About to post: \(notificationName) notification from \(object) with userInfo: \(userInfo)")
📡.post(notificationName, from: object, with: userInfo)
📡.post(name: NSNotification.Name(rawValue: notificationName), object: object, userInfo: userInfo)
}
public func post(notificationName:String, from object:AnyObject?)
public func post(_ notificationName:String, from object:Any?)
{
📡.post(notificationName, from: object, with: /* userInfo as */ nil)
📡.post(name: NSNotification.Name(rawValue: notificationName), object: object, userInfo: /* userInfo as */ nil)
}
public func post(notificationName:String)
public func post(_ notificationName:String)
{
📡.post(notificationName)
}
......@@ -124,15 +124,15 @@ public func post(notificationName:String)
// MARK: - Handling notifications
//
public func handle(notificationName:String, with selector:Selector, on observer:AnyObject)
public func handle(_ notificationName:String, with selector:Selector, on observer:Any)
{
📡.addObserver(observer, selector: selector, name: notificationName, object: nil)
📡.addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: notificationName), object: nil)
}
public func handle(notificationName:String, from object:AnyObject?, with selector:Selector, on observer:AnyObject)
public func handle(_ notificationName:String, from object:Any?, with selector:Selector, on observer:Any)
{
📡.addObserver(observer, selector: selector, name: notificationName, object: object)
📡.addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: notificationName), object: object)
}
......@@ -140,13 +140,13 @@ public func handle(notificationName:String, from object:AnyObject?, with selecto
// MARK: - Removing notification handlers.
//
public func remove(observer observer:AnyObject, forNotificationNamed name:String?)
public func remove(observer:Any, forNotificationNamed name:String?)
{
📡.removeObserver(observer, name: name, object: nil)
📡.removeObserver(observer, name: name.map { NSNotification.Name(rawValue: $0) }, object: nil)
}
public func remove(observer observer:AnyObject, forNotificationNamed name:String?, from object:AnyObject?)
public func remove(observer:Any, forNotificationNamed name:String?, from object:Any?)
{
📡.removeObserver(observer, name: name, object: object)
📡.removeObserver(observer, name: name.map { NSNotification.Name(rawValue: $0) }, object: object)
}
......@@ -22,21 +22,21 @@
// MARK: - Extension
//
extension NSNotificationCenter
extension NotificationCenter
{
//
// MARK: - Adding observers
//
public func handle(notificationName:String, with selector:Selector, on observer:AnyObject)
public func handle(_ notificationName:String, with selector:Selector, on observer:AnyObject)
{
self.addObserver(observer, selector: selector, name: notificationName, object: nil)
self.addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: notificationName), object: nil)
}
public func handle(notificationName:String, from object:AnyObject?, with selector:Selector, on observer:AnyObject)
public func handle(_ notificationName:String, from object:AnyObject?, with selector:Selector, on observer:AnyObject)
{
self.addObserver(observer, selector: selector, name: notificationName, object: object)
self.addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: notificationName), object: object)
}
......@@ -45,15 +45,15 @@ extension NSNotificationCenter
//
public func remove(observer observer:AnyObject, forNotificationNamed name:String?)
public func remove(observer:AnyObject, forNotificationNamed name:String?)
{
self.removeObserver(observer, name: name, object: nil)
self.removeObserver(observer, name: name.map { NSNotification.Name(rawValue: $0) }, object: nil)
}
public func remove(observer observer:AnyObject, forNotificationNamed name:String?, from object:AnyObject?)
public func remove(observer:AnyObject, forNotificationNamed name:String?, from object:AnyObject?)
{
self.removeObserver(observer, name: name, object: object)
self.removeObserver(observer, name: name.map { NSNotification.Name(rawValue: $0) }, object: object)
}
......@@ -62,29 +62,29 @@ extension NSNotificationCenter
//
public func post(notificationName:String, from object:AnyObject?, with userInfo:[NSObject : AnyObject]?)
public func post(_ notificationName:String, from object:AnyObject?, with userInfo:[NSObject : AnyObject]?)
{
// Note: notifications are dispatched on the main thread. This is most likely what you’re expecting anyway.
// (And if not, I’m sure you’re wizard enough to send me a pull request.) ;)
dispatch_async(dispatch_get_main_queue())
DispatchQueue.main.async
{
self.postNotificationName(notificationName, object: object, userInfo: userInfo)
self.post(name: Notification.Name(rawValue: notificationName), object: object, userInfo: userInfo)
}
}
public func post(notificationName:String, from object:AnyObject?)
public func post(_ notificationName:String, from object:AnyObject?)
{
self.post(notificationName, from: object, with: /* userInfo as */ nil)
}
public func post(notificationName:String)
public func post(_ notificationName:String)
{
#if os(OSX)
self.post(notificationName, from: NSApplication.sharedApplication(), with: /* userInfo as */ nil)
self.post(notificationName, from: NSApplication.shared(), with: /* userInfo as */ nil)
#elseif os(iOS)
self.post(notificationName, from: UIApplication.sharedApplication(), with: /* userInfo as */ nil)
self.post(notificationName, from: UIApplication.shared, with: /* userInfo as */ nil)
#endif
}
......@@ -96,4 +96,4 @@ extension NSNotificationCenter
// {
// self.postNotification(notification)
// }
}
\ No newline at end of file
}
......@@ -28,7 +28,7 @@ class HandleTests: XCTestCase {
func testPerformanceExample() {
// This is an example of a performance test case.
self.measureBlock {
self.measure {
// Put the code you want to measure the time of here.
}
}
......
......@@ -111,6 +111,7 @@
TargetAttributes = {
A7C0EB491C242CEE00110179 = {
CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
};
};
};
......@@ -204,7 +205,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
......@@ -242,7 +243,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.11;
MACOSX_DEPLOYMENT_TARGET = 10.12;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = macosx;
};
......@@ -255,8 +256,10 @@
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "HandleDemo-OSX/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = "ind.ie.HandleDemo-OSX";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
......@@ -267,8 +270,10 @@
COMBINE_HIDPI_IMAGES = YES;
INFOPLIST_FILE = "HandleDemo-OSX/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.11;
PRODUCT_BUNDLE_IDENTIFIER = "ind.ie.HandleDemo-OSX";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Release;
};
......@@ -291,6 +296,7 @@
A7C0EB5B1C242CEE00110179 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
......
......@@ -13,11 +13,11 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(aNotification: NSNotification) {
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
}
func applicationWillTerminate(aNotification: NSNotification) {
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
......
......@@ -20,7 +20,7 @@ class OSXViewController: NSViewController
{
super.viewDidLoad()
windowDidMoveHandler = windowDidMoveHandler ?? handle(NSWindowDidMoveNotification)
windowDidMoveHandler = windowDidMoveHandler ?? handle(Notification.Name.NSWindowDidMove.rawValue)
{
/* with */ notification in
......@@ -30,7 +30,7 @@ class OSXViewController: NSViewController
}
}
@IBAction func stopHandlingWindowMoves(sender: NSButton)
@IBAction func stopHandlingWindowMoves(_ sender: NSButton)
{
destroyNotificationHandler(&windowDidMoveHandler)
messageLabel.stringValue = "No longer handling notifications."
......
......@@ -111,11 +111,12 @@
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0720;
LastUpgradeCheck = 0720;
LastUpgradeCheck = 0800;
ORGANIZATIONNAME = "Aral Balkan";
TargetAttributes = {
A7C0EB221C23513700110179 = {
CreatedOnToolsVersion = 7.2;
LastSwiftMigration = 0800;
};
};
};
......@@ -195,8 +196,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;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
......@@ -240,8 +243,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;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
......@@ -273,6 +278,7 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "ind.ie.HandleDemo-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 3.0;
};
name = Debug;
};
......@@ -284,6 +290,8 @@
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "ind.ie.HandleDemo-iOS";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 3.0;
};
name = Release;
};
......
......@@ -7,37 +7,59 @@
//
import UIKit
import Handle
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
/// To demonstrate notification handling.
var demoNotificationHandler: NotificationHandler?
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool
{
// Add handler
demoNotificationHandler = demoNotificationHandler ?? handle(DemoNotification.named(.orientationDidChange))
{
/* with */ notification in
guard
let userInfo = notification.userInfo,
let orientationName = userInfo["orientationName"]
else
{
print("Warning: Could not get notification name.")
return
}
print("Got orientation change notification in App Delegate.\nOrientation is now: \(orientationName)")
}
return true
}
func applicationWillResignActive(application: UIApplication) {
func applicationWillResignActive(_ application: UIApplication) {
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}
func applicationDidEnterBackground(application: UIApplication) {
func applicationDidEnterBackground(_ application: UIApplication) {
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}
func applicationWillEnterForeground(application: UIApplication) {
func applicationWillEnterForeground(_ application: UIApplication) {
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}
func applicationDidBecomeActive(application: UIApplication) {
func applicationDidBecomeActive(_ application: UIApplication) {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}
func applicationWillTerminate(application: UIApplication) {
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}
......
......@@ -9,6 +9,17 @@
import UIKit
import Handle
enum DemoNotification:String
{
case orientationDidChange
static func named(_ notificationName: DemoNotification) -> String
{
return notificationName.rawValue
}
}
class ViewController: UIViewController
{
@IBOutlet weak var orientationLabel: UILabel!
......@@ -23,13 +34,16 @@ class ViewController: UIViewController
{
super.viewDidLoad()
orientationWillChangeHandler = orientationWillChangeHandler ?? handle(UIApplicationWillChangeStatusBarOrientationNotification)
orientationWillChangeHandler = orientationWillChangeHandler ?? handle(Notification.Name.UIApplicationWillChangeStatusBarOrientation.rawValue)
{
/* with */ notification in
guard let orientation = notification.userInfo?[UIApplicationStatusBarOrientationUserInfoKey] as? Int else { return }
let orientationName = self.orientationNames[orientation]
// Post a notification
post(DemoNotification.named(.orientationDidChange), from: self, with: ["orientationName": orientationName])
self.orientationLabel.text = "\(orientationName) orientation."
}
}
......@@ -40,15 +54,15 @@ class ViewController: UIViewController
// Dispose of any resources that can be recreated.
}
@IBAction func stopListeningForOrientationChanges(sender: UIButton)
@IBAction func stopListeningForOrientationChanges(_ sender: UIButton)
{
destroyNotificationHandler(&orientationWillChangeHandler)
orientationLabel.text = "No longer handling notifications."
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask
override var supportedInterfaceOrientations: UIInterfaceOrientationMask
{
return .All
return .all
}
}
......@@ -2,12 +2,29 @@
Handle is an easy-to-use, expressive Swift micro-library for handling notifications.
**This is the master branch (Swift 2.2.1).** Also available: [Swift 2.3](https://source.ind.ie/project/handle/tree/swift-2.3) and [Swift 3](https://source.ind.ie/project/handle/tree/swift-3) branch
**This is the master branch (Swift 3).**
The following, branches are also available but have been deprecated as of Xcode 8 GM:
* [Swift 2.2](https://source.ind.ie/project/handle/tree/swift-2.2)
* [Swift 2.3](https://source.ind.ie/project/handle/tree/swift-2.3)
**Supported on:** Xcode 8 GM+
## Installation
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
```
git "git@source.ind.ie:project/handle.git"
```
To include the Swift 2.3 or 2.2 versions, make sure you specify the branch in your Cartfile. e.g.:
```
git "git@source.ind.ie:project/handle.git" "swift-2.3"
```
The Handle demonstration apps do not have any dependencies, just open up the Delay.xcworkspace in Xcode and build and run the iOS and OS X demos.
See the [detailed installation instructions](#detailed-installation-instructions), below, for instructions on how to add Delay to your own apps.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment