├── SwiftFlow ├── SwiftFlow-Bridging-Header.h ├── ViewController.swift ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib ├── Info.plist └── AppDelegate.swift ├── SwiftFlow.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── SwiftFlow.h ├── SwiftFlowTests ├── Info.plist └── SwiftFlowTests.swift ├── SwiftFlow.m ├── SwiftFlow.swift └── README.md /SwiftFlow/SwiftFlow-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | #import "SwiftFlow.h" 6 | -------------------------------------------------------------------------------- /SwiftFlow.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SwiftFlow.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftFlow.h 3 | // SwiftFlow 4 | // 5 | // Created by John Holdsworth on 31/03/2015. 6 | // Copyright (c) 2015 John Holdsworth. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | extern void _try( void (^tryBlock)() ); 12 | extern void _catch( void (^catchBlock)( NSException *e ) ); 13 | extern void _throw( NSException *e ); 14 | extern void _synchronized( id object, void (^syncBlock)() ); 15 | -------------------------------------------------------------------------------- /SwiftFlow/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // SwiftFlow 4 | // 5 | // Created by John Holdsworth on 31/03/2015. 6 | // Copyright (c) 2015 John Holdsworth. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do any additional setup after loading the view, typically from a nib. 16 | } 17 | 18 | override func didReceiveMemoryWarning() { 19 | super.didReceiveMemoryWarning() 20 | // Dispose of any resources that can be recreated. 21 | } 22 | 23 | 24 | } 25 | 26 | -------------------------------------------------------------------------------- /SwiftFlowTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /SwiftFlow.m: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftFlow.m 3 | // SwiftFlow 4 | // 5 | // Created by John Holdsworth on 31/03/2015. 6 | // Copyright (c) 2015 John Holdsworth. All rights reserved. 7 | // 8 | 9 | #import "SwiftFlow.h" 10 | 11 | static NSString *kLastExceptionKey = @"lastTryCatchException"; 12 | 13 | void _try( void (^tryBlock)() ) { 14 | [[NSThread currentThread].threadDictionary removeObjectForKey:kLastExceptionKey]; 15 | @try { 16 | tryBlock(); 17 | } 18 | @catch (NSException *e) { 19 | [NSThread currentThread].threadDictionary[kLastExceptionKey] = e; 20 | } 21 | } 22 | 23 | void _catch( void (^catchBlock)( NSException *e ) ) { 24 | NSException *e = [NSThread currentThread].threadDictionary[kLastExceptionKey]; 25 | if ( e ) { 26 | catchBlock( e ); 27 | } 28 | } 29 | 30 | void _throw( NSException *e ) { 31 | @try { 32 | @throw e; 33 | } 34 | @catch ( NSException *e ) { 35 | NSLog( @"%@ %@\n%@", e.name, e.reason, e.callStackSymbols ); 36 | @throw e; 37 | } 38 | } 39 | 40 | void _synchronized( id object, void (^syncBlock)() ) { 41 | @synchronized( object ) { 42 | syncBlock(); 43 | } 44 | } 45 | 46 | -------------------------------------------------------------------------------- /SwiftFlow/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "29x29", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "29x29", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "40x40", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "40x40", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "76x76", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "76x76", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /SwiftFlow/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /SwiftFlow/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /SwiftFlow/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // SwiftFlow 4 | // 5 | // Created by John Holdsworth on 31/03/2015. 6 | // Copyright (c) 2015 John Holdsworth. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // 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. 24 | // 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. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // 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. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // 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. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // 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. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /SwiftFlow/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /SwiftFlow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftFlow.swift 3 | // SwiftFlow 4 | // 5 | // Created by John Holdsworth on 31/03/2015. 6 | // Copyright (c) 2015 John Holdsworth. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // throw exception on invalid unwrap (in production only) 12 | 13 | public func unwrap(_ toUnwrap: T!, name: String? = nil, file: String = #file, line: Int = #line ) -> T { 14 | #if !DEBUG 15 | if toUnwrap == nil { 16 | let exceptionName = name != nil ? "Forced unwrap of \(name) fail" : "Forced unwrap fail" 17 | _throw( NSException( name: NSExceptionName(rawValue: exceptionName), reason: "\(file), \(line)", userInfo: nil ) ) 18 | } 19 | #endif 20 | return toUnwrap! 21 | } 22 | 23 | // an implementation of @sychronized to make acces to a section of code exclusive 24 | 25 | private let synchronizedKeyLock = NSLock() 26 | private var synchronizedSectionLocks = [String:NSLock]() 27 | 28 | public func _synchronized( _ section: @escaping () -> (), key: String = "\(#file):\(#line)" ) { 29 | synchronizedKeyLock.lock() 30 | if synchronizedSectionLocks[key] == nil { 31 | synchronizedSectionLocks[key] = NSLock() 32 | } 33 | synchronizedKeyLock.unlock() 34 | if let sectionLock = synchronizedSectionLocks[key] { 35 | sectionLock.lock() 36 | _try { 37 | section() 38 | sectionLock.unlock() 39 | } 40 | _catch { 41 | (exception) in 42 | sectionLock.unlock() 43 | _throw( exception ) 44 | } 45 | } 46 | } 47 | 48 | // a take on shell-like custom threading operators after: 49 | // http://ijoshsmith.com/2014/07/05/custom-threading-operator-in-swift/ 50 | 51 | private let _queue = DispatchQueue(label: "SwiftFlow", attributes: .concurrent) 52 | 53 | public func | (left: @escaping () -> Void, right: @escaping () -> Void) { 54 | _queue.async() { 55 | left() 56 | DispatchQueue.main.async(execute: right) 57 | } 58 | } 59 | 60 | public func | (left: @escaping () -> R, right: @escaping (_ result:R) -> Void) { 61 | _queue.async() { 62 | let result = left() 63 | DispatchQueue.main.async(execute: { 64 | right(result) 65 | }) 66 | } 67 | } 68 | 69 | // dispatch groups { block } & { block } | { completion } 70 | public func & (left: @escaping () -> Void, right: @escaping () -> Void) -> [() -> Void] { 71 | return [left, right] 72 | } 73 | 74 | public func & (left: [() -> Void], right: @escaping () -> Void) -> [() -> Void] { 75 | var out = left 76 | out.append( right ) 77 | return out 78 | } 79 | 80 | public func | (left: [() -> Void], right: @escaping () -> Void) { 81 | let group = DispatchGroup() 82 | 83 | for block in left { 84 | __dispatch_group_async(group, _queue, block) 85 | } 86 | 87 | __dispatch_group_notify(group, DispatchQueue.main, right) 88 | } 89 | 90 | // parallel processing blocks with returns 91 | public func & (left: @escaping () -> R, right: @escaping () -> R) -> [() -> R] { 92 | return [left, right] 93 | } 94 | 95 | public func & (left: [() -> R], right: @escaping () -> R) -> [() -> R] { 96 | var out = left 97 | out.append( right ) 98 | return out 99 | } 100 | 101 | public func | (left: [() -> R], right: @escaping (_ results:[R?]) -> Void) { 102 | let group = DispatchGroup() 103 | 104 | var results = Array() 105 | for _ in 0.. String? { 28 | if let url = URL( string: "https://github.com/\(unwrap(user))/\(repo)" ) { 29 | do { 30 | let string = try NSString( contentsOf: url, encoding: String.Encoding.utf8.rawValue ) 31 | return string as String 32 | } catch let error as NSError { 33 | _throw( NSException( name: NSExceptionName(rawValue: "fetchURL: Could not fetch"), 34 | reason: error.localizedDescription, userInfo: nil ) ) 35 | } 36 | } else { 37 | _throw( NSException( name: NSExceptionName(rawValue: "fetchURL"), reason: "Invalid URL", userInfo: nil) ) 38 | } 39 | return nil 40 | } 41 | 42 | func testExample() { 43 | // This is an example of a functional test case. 44 | 45 | var gotException = false 46 | _try { 47 | _ = self.fetchURL( "SwiftFlow" ) 48 | } 49 | _catch { 50 | (exception) in 51 | gotException = true 52 | } 53 | XCTAssert(gotException, "Pass") 54 | 55 | gotException = false 56 | _try { 57 | _ = unwrap(self.user) 58 | } 59 | _catch { 60 | (exception) in 61 | gotException = true 62 | } 63 | XCTAssert(gotException, "Pass") 64 | 65 | user = "johnno1962" 66 | 67 | gotException = false 68 | _try { 69 | _ = unwrap(self.user) 70 | } 71 | _catch { 72 | (exception) in 73 | gotException = true 74 | } 75 | XCTAssert(!gotException, "Pass") 76 | 77 | gotException = false 78 | _try { 79 | _ = self.fetchURL( "Cabbage" ) 80 | } 81 | _catch { 82 | (exception) in 83 | gotException = true 84 | } 85 | XCTAssert(gotException, "Pass") 86 | 87 | gotException = false 88 | _try { 89 | _ = self.fetchURL( "SwiftFlow" ) 90 | } 91 | _catch { 92 | (exception) in 93 | gotException = true 94 | } 95 | XCTAssert(!gotException, "Pass") 96 | 97 | var exceuted = false 98 | _synchronized( { 99 | exceuted = true 100 | } ) 101 | XCTAssert(exceuted, "Pass") 102 | 103 | exceuted = false 104 | _synchronized( self ) { 105 | exceuted = true 106 | } 107 | XCTAssert(exceuted, "Pass") 108 | 109 | var i = 0; // 110 | 111 | { 112 | print("Task #1") 113 | for _ in 0 ..< 10000000 { 114 | } 115 | print("\(i)") 116 | i += 1 117 | } & { 118 | print("Task #2") 119 | for _ in 0 ..< 20000000 { 120 | } 121 | print("\(i)") 122 | i += 1 123 | } & { 124 | print("Task #3") 125 | for _ in 0 ..< 30000000 { 126 | } 127 | print("\(i)") 128 | i += 1 129 | } | { 130 | print("Completed \(i)") 131 | }; 132 | 133 | { 134 | return 99 135 | } | { 136 | (result:Int) in 137 | print("\(result)") 138 | }; 139 | 140 | { 141 | return 88 142 | } & { 143 | return 99 144 | } | { 145 | (results:[Int?]) in 146 | print("\(results)") 147 | }; 148 | } 149 | 150 | func testPerformanceExample() { 151 | // This is an example of a performance test case. 152 | self.measure() { 153 | // Put the code you want to measure the time of here. 154 | } 155 | } 156 | 157 | } 158 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## SwiftFlow 2 | 3 | Many have considered the ommision of exceptions from Swift an oversight and this doesn't look likely to change soon. Thankfully this is an oversight that is quite easilly rectified as others [have](https://github.com/williamFalcon/SwiftFlow), [observed](https://github.com/kongtomorrow/TryCatchFinally-Swift). 4 | 5 | I've extended this slightly to deal with the mixed blessing that is dealing with unwrapping optionals. `"If let"` is all very well (crash avoided) but what about the "else" clause which is often left out? How can it report the error to aid in debugging when a nil optional is encountered within a function called by a function called by a function. What if it has to return a value? Is the only option really to crash the application? Perhaps every return should be of a [result type](https://gist.github.com/landonf/539354d19175c9e5239b) though this clutters source all the way down the stack and somewhere the error has to be handled and reported. 6 | 7 | Why not just use exceptions? The code is minimal though it requires a small Objective-C stub. 8 | 9 | ```objc 10 | static NSString *kLastExceptionKey = @"lastTryCatchException"; 11 | 12 | void _try( void (^tryBlock)() ) { 13 | [[NSThread currentThread].threadDictionary removeObjectForKey:kLastExceptionKey]; 14 | @try { 15 | tryBlock(); 16 | } 17 | @catch (NSException *e) { 18 | [NSThread currentThread].threadDictionary[kLastExceptionKey] = e; 19 | } 20 | } 21 | 22 | void _catch( void (^catchBlock)( NSException *e ) ) { 23 | NSException *e = [NSThread currentThread].threadDictionary[kLastExceptionKey]; 24 | if ( e ) { 25 | catchBlock( e ); 26 | } 27 | } 28 | 29 | void _throw( NSException *e ) { 30 | @try { 31 | @throw e; 32 | } 33 | @catch ( NSException *e ) { 34 | NSLog( @"%@ %@\n%@", e.name, e.reason, e.callStackSymbols ); 35 | @throw e; 36 | } 37 | } 38 | ``` 39 | 40 | Thereafter, you can use these functions pretty much as you would in Objective-C (see the project's tests for examples) 41 | 42 | ```swift 43 | _try { 44 | // involved code that might fail (unwrapping?) somewhere 45 | } 46 | _catch { 47 | (exception: NSException) in 48 | // handle error 49 | } 50 | // _finally not implemented as code after the try catch will always be executed. 51 | ``` 52 | 53 | To throw exceptions on failed unwrap include the following code in your Swift 54 | 55 | ```swift 56 | public func U( toUnwrap: T!, file: String = __FILE__, line: Int = __LINE__ ) -> T { 57 | #if !DEBUG 58 | if toUnwrap == nil { 59 | _throw( NSException( name: "Forced unwrap fail", reason: "\(file), \(line)", userInfo: nil ) ) 60 | } 61 | #endif 62 | return toUnwrap! 63 | } 64 | ``` 65 | 66 | Use `U(optional)` everywhere you might be forced to use `"!"`. This will retain the debuggability of failed unwraps but gives some protection from an instant crash in production (provided the code is wrapped at entry in a `_catch{}` (you might want to consider using "-fobjc-arc-exceptions" to have objects release correctly when exceptions are thrown.) 67 | 68 | This might seem a recipie for encouraging lazy coding practice but in reality unless you can provide a value for a property in an initiliser optionals will crop up all over your code. Coping with every conceivable case where an optional could be nil dilutes the content of code dealing with what are often exceptional cases. 69 | 70 | ### Other Swift flow constructs 71 | 72 | SwiftFlow has been renamed SwiftFlow as it now includes a couple of other flow of control primitives. First two implementations of @sychronised for Swift. The first is can lock a piece of code against an object as per Objective-C. 73 | 74 | ```objc 75 | void _synchronized( id object, void (^syncBlock)() ) { 76 | @synchronized( object ) { 77 | syncBlock(); 78 | } 79 | } 80 | ``` 81 | 82 | The second locks only a section of code but gloabally using the file and line number: 83 | 84 | ```swift 85 | private let synchronizedKeyLock = NSLock() 86 | private var synchronizedSectionLocks = [String:NSLock]() 87 | 88 | public func _synchronized( section: () -> (), key: String = "\(__FILE__):\(__LINE__)" ) { 89 | synchronizedKeyLock.lock() 90 | if synchronizedSectionLocks[key] == nil { 91 | synchronizedSectionLocks[key] = NSLock() 92 | } 93 | synchronizedKeyLock.unlock() 94 | if let sectionLock = synchronizedSectionLocks[key] { 95 | sectionLock.lock() 96 | _try { 97 | section() 98 | sectionLock.unlock() 99 | } 100 | _catch { 101 | (exception) in 102 | sectionLock.unlock() 103 | _throw( exception ) 104 | } 105 | } 106 | } 107 | ``` 108 | 109 | ### Some threading operators 110 | 111 | As an excercise I've added in my take on Josh Smith's 112 | [custom threading operators](http://ijoshsmith.com/2014/07/05/custom-threading-operator-in-swift/) 113 | for background process (adding dispatch groups.) The syntax is taken from UNIX shell. 114 | For example, the following processes the first group in a background thread then 115 | passes the result back to the main thread to print it out: 116 | 117 | ```Swift 118 | { 119 | // async background 120 | return 99 121 | } | { 122 | // main thread again 123 | (result:Int) in 124 | println("\(result)") 125 | }; 126 | ``` 127 | 128 | This works for thread groups as well where multiple blocks are executed in 129 | parallel again following shell syntax where multiple parallel blocks are 130 | separated by the & operator. The array of their results are passed back 131 | to the main thread using the pipe operator as before: 132 | 133 | ```Swift 134 | { 135 | // thread 1 136 | return 77 137 | } & { 138 | // thread 2 139 | return 88 140 | } & { 141 | // thread 3 142 | return 99 143 | } | { 144 | // main thread 145 | (results:[Int!]) in 146 | println("\(results)") 147 | }; 148 | ``` 149 | 150 | There are also & and | operators for when no value is passed between the blocks. 151 | The semicolon is necessary as is one on the line previous to using these 152 | operators. 153 | 154 | ### Public domain License 155 | 156 | This code is in the public domain. Just don't sue me ok? 157 | -------------------------------------------------------------------------------- /SwiftFlow.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | BBDCF0761ACA8446003352FD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDCF0751ACA8446003352FD /* AppDelegate.swift */; }; 11 | BBDCF0781ACA8446003352FD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDCF0771ACA8446003352FD /* ViewController.swift */; }; 12 | BBDCF07B1ACA8446003352FD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BBDCF0791ACA8446003352FD /* Main.storyboard */; }; 13 | BBDCF07D1ACA8446003352FD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BBDCF07C1ACA8446003352FD /* Images.xcassets */; }; 14 | BBDCF0801ACA8446003352FD /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = BBDCF07E1ACA8446003352FD /* LaunchScreen.xib */; }; 15 | BBDCF08C1ACA8446003352FD /* SwiftFlowTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDCF08B1ACA8446003352FD /* SwiftFlowTests.swift */; }; 16 | BBDCF0961ACA8CAB003352FD /* SwiftFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBDCF0951ACA8CAB003352FD /* SwiftFlow.swift */; }; 17 | BBDCF09A1ACA8D40003352FD /* SwiftFlow.m in Sources */ = {isa = PBXBuildFile; fileRef = BBDCF0991ACA8D40003352FD /* SwiftFlow.m */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXContainerItemProxy section */ 21 | BBDCF0861ACA8446003352FD /* PBXContainerItemProxy */ = { 22 | isa = PBXContainerItemProxy; 23 | containerPortal = BBDCF0681ACA8446003352FD /* Project object */; 24 | proxyType = 1; 25 | remoteGlobalIDString = BBDCF06F1ACA8446003352FD; 26 | remoteInfo = SwiftFlow; 27 | }; 28 | /* End PBXContainerItemProxy section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | BBDCF0701ACA8446003352FD /* SwiftFlow.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftFlow.app; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | BBDCF0741ACA8446003352FD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | BBDCF0751ACA8446003352FD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 34 | BBDCF0771ACA8446003352FD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 35 | BBDCF07A1ACA8446003352FD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 36 | BBDCF07C1ACA8446003352FD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 37 | BBDCF07F1ACA8446003352FD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 38 | BBDCF0851ACA8446003352FD /* SwiftFlowTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftFlowTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | BBDCF08A1ACA8446003352FD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | BBDCF08B1ACA8446003352FD /* SwiftFlowTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftFlowTests.swift; sourceTree = ""; }; 41 | BBDCF0951ACA8CAB003352FD /* SwiftFlow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftFlow.swift; sourceTree = SOURCE_ROOT; }; 42 | BBDCF0971ACA8D3F003352FD /* SwiftFlow-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftFlow-Bridging-Header.h"; sourceTree = ""; }; 43 | BBDCF0981ACA8D40003352FD /* SwiftFlow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwiftFlow.h; sourceTree = SOURCE_ROOT; }; 44 | BBDCF0991ACA8D40003352FD /* SwiftFlow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SwiftFlow.m; sourceTree = SOURCE_ROOT; }; 45 | BBDCF09B1ACAA3DE003352FD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; 46 | /* End PBXFileReference section */ 47 | 48 | /* Begin PBXFrameworksBuildPhase section */ 49 | BBDCF06D1ACA8446003352FD /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | BBDCF0821ACA8446003352FD /* Frameworks */ = { 57 | isa = PBXFrameworksBuildPhase; 58 | buildActionMask = 2147483647; 59 | files = ( 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | /* End PBXFrameworksBuildPhase section */ 64 | 65 | /* Begin PBXGroup section */ 66 | BBDCF0671ACA8446003352FD = { 67 | isa = PBXGroup; 68 | children = ( 69 | BBDCF09B1ACAA3DE003352FD /* README.md */, 70 | BBDCF0721ACA8446003352FD /* SwiftFlow */, 71 | BBDCF0881ACA8446003352FD /* SwiftFlowTests */, 72 | BBDCF0711ACA8446003352FD /* Products */, 73 | ); 74 | sourceTree = ""; 75 | }; 76 | BBDCF0711ACA8446003352FD /* Products */ = { 77 | isa = PBXGroup; 78 | children = ( 79 | BBDCF0701ACA8446003352FD /* SwiftFlow.app */, 80 | BBDCF0851ACA8446003352FD /* SwiftFlowTests.xctest */, 81 | ); 82 | name = Products; 83 | sourceTree = ""; 84 | }; 85 | BBDCF0721ACA8446003352FD /* SwiftFlow */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | BBDCF0981ACA8D40003352FD /* SwiftFlow.h */, 89 | BBDCF0991ACA8D40003352FD /* SwiftFlow.m */, 90 | BBDCF0951ACA8CAB003352FD /* SwiftFlow.swift */, 91 | BBDCF0751ACA8446003352FD /* AppDelegate.swift */, 92 | BBDCF0771ACA8446003352FD /* ViewController.swift */, 93 | BBDCF0791ACA8446003352FD /* Main.storyboard */, 94 | BBDCF07C1ACA8446003352FD /* Images.xcassets */, 95 | BBDCF07E1ACA8446003352FD /* LaunchScreen.xib */, 96 | BBDCF0731ACA8446003352FD /* Supporting Files */, 97 | ); 98 | path = SwiftFlow; 99 | sourceTree = ""; 100 | }; 101 | BBDCF0731ACA8446003352FD /* Supporting Files */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | BBDCF0971ACA8D3F003352FD /* SwiftFlow-Bridging-Header.h */, 105 | BBDCF0741ACA8446003352FD /* Info.plist */, 106 | ); 107 | name = "Supporting Files"; 108 | sourceTree = ""; 109 | }; 110 | BBDCF0881ACA8446003352FD /* SwiftFlowTests */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | BBDCF08B1ACA8446003352FD /* SwiftFlowTests.swift */, 114 | BBDCF0891ACA8446003352FD /* Supporting Files */, 115 | ); 116 | path = SwiftFlowTests; 117 | sourceTree = ""; 118 | }; 119 | BBDCF0891ACA8446003352FD /* Supporting Files */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | BBDCF08A1ACA8446003352FD /* Info.plist */, 123 | ); 124 | name = "Supporting Files"; 125 | sourceTree = ""; 126 | }; 127 | /* End PBXGroup section */ 128 | 129 | /* Begin PBXNativeTarget section */ 130 | BBDCF06F1ACA8446003352FD /* SwiftFlow */ = { 131 | isa = PBXNativeTarget; 132 | buildConfigurationList = BBDCF08F1ACA8446003352FD /* Build configuration list for PBXNativeTarget "SwiftFlow" */; 133 | buildPhases = ( 134 | BBDCF06C1ACA8446003352FD /* Sources */, 135 | BBDCF06D1ACA8446003352FD /* Frameworks */, 136 | BBDCF06E1ACA8446003352FD /* Resources */, 137 | ); 138 | buildRules = ( 139 | ); 140 | dependencies = ( 141 | ); 142 | name = SwiftFlow; 143 | productName = SwiftFlow; 144 | productReference = BBDCF0701ACA8446003352FD /* SwiftFlow.app */; 145 | productType = "com.apple.product-type.application"; 146 | }; 147 | BBDCF0841ACA8446003352FD /* SwiftFlowTests */ = { 148 | isa = PBXNativeTarget; 149 | buildConfigurationList = BBDCF0921ACA8446003352FD /* Build configuration list for PBXNativeTarget "SwiftFlowTests" */; 150 | buildPhases = ( 151 | BBDCF0811ACA8446003352FD /* Sources */, 152 | BBDCF0821ACA8446003352FD /* Frameworks */, 153 | BBDCF0831ACA8446003352FD /* Resources */, 154 | ); 155 | buildRules = ( 156 | ); 157 | dependencies = ( 158 | BBDCF0871ACA8446003352FD /* PBXTargetDependency */, 159 | ); 160 | name = SwiftFlowTests; 161 | productName = SwiftFlowTests; 162 | productReference = BBDCF0851ACA8446003352FD /* SwiftFlowTests.xctest */; 163 | productType = "com.apple.product-type.bundle.unit-test"; 164 | }; 165 | /* End PBXNativeTarget section */ 166 | 167 | /* Begin PBXProject section */ 168 | BBDCF0681ACA8446003352FD /* Project object */ = { 169 | isa = PBXProject; 170 | attributes = { 171 | LastSwiftUpdateCheck = 0700; 172 | LastUpgradeCheck = 0820; 173 | ORGANIZATIONNAME = "John Holdsworth"; 174 | TargetAttributes = { 175 | BBDCF06F1ACA8446003352FD = { 176 | CreatedOnToolsVersion = 6.2; 177 | DevelopmentTeam = 9V5A8WE85E; 178 | LastSwiftMigration = 0820; 179 | }; 180 | BBDCF0841ACA8446003352FD = { 181 | CreatedOnToolsVersion = 6.2; 182 | DevelopmentTeam = 9V5A8WE85E; 183 | LastSwiftMigration = 0820; 184 | TestTargetID = BBDCF06F1ACA8446003352FD; 185 | }; 186 | }; 187 | }; 188 | buildConfigurationList = BBDCF06B1ACA8446003352FD /* Build configuration list for PBXProject "SwiftFlow" */; 189 | compatibilityVersion = "Xcode 3.2"; 190 | developmentRegion = English; 191 | hasScannedForEncodings = 0; 192 | knownRegions = ( 193 | en, 194 | Base, 195 | ); 196 | mainGroup = BBDCF0671ACA8446003352FD; 197 | productRefGroup = BBDCF0711ACA8446003352FD /* Products */; 198 | projectDirPath = ""; 199 | projectRoot = ""; 200 | targets = ( 201 | BBDCF06F1ACA8446003352FD /* SwiftFlow */, 202 | BBDCF0841ACA8446003352FD /* SwiftFlowTests */, 203 | ); 204 | }; 205 | /* End PBXProject section */ 206 | 207 | /* Begin PBXResourcesBuildPhase section */ 208 | BBDCF06E1ACA8446003352FD /* Resources */ = { 209 | isa = PBXResourcesBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | BBDCF07B1ACA8446003352FD /* Main.storyboard in Resources */, 213 | BBDCF0801ACA8446003352FD /* LaunchScreen.xib in Resources */, 214 | BBDCF07D1ACA8446003352FD /* Images.xcassets in Resources */, 215 | ); 216 | runOnlyForDeploymentPostprocessing = 0; 217 | }; 218 | BBDCF0831ACA8446003352FD /* Resources */ = { 219 | isa = PBXResourcesBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | ); 223 | runOnlyForDeploymentPostprocessing = 0; 224 | }; 225 | /* End PBXResourcesBuildPhase section */ 226 | 227 | /* Begin PBXSourcesBuildPhase section */ 228 | BBDCF06C1ACA8446003352FD /* Sources */ = { 229 | isa = PBXSourcesBuildPhase; 230 | buildActionMask = 2147483647; 231 | files = ( 232 | BBDCF0781ACA8446003352FD /* ViewController.swift in Sources */, 233 | BBDCF09A1ACA8D40003352FD /* SwiftFlow.m in Sources */, 234 | BBDCF0961ACA8CAB003352FD /* SwiftFlow.swift in Sources */, 235 | BBDCF0761ACA8446003352FD /* AppDelegate.swift in Sources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | BBDCF0811ACA8446003352FD /* Sources */ = { 240 | isa = PBXSourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | BBDCF08C1ACA8446003352FD /* SwiftFlowTests.swift in Sources */, 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | /* End PBXSourcesBuildPhase section */ 248 | 249 | /* Begin PBXTargetDependency section */ 250 | BBDCF0871ACA8446003352FD /* PBXTargetDependency */ = { 251 | isa = PBXTargetDependency; 252 | target = BBDCF06F1ACA8446003352FD /* SwiftFlow */; 253 | targetProxy = BBDCF0861ACA8446003352FD /* PBXContainerItemProxy */; 254 | }; 255 | /* End PBXTargetDependency section */ 256 | 257 | /* Begin PBXVariantGroup section */ 258 | BBDCF0791ACA8446003352FD /* Main.storyboard */ = { 259 | isa = PBXVariantGroup; 260 | children = ( 261 | BBDCF07A1ACA8446003352FD /* Base */, 262 | ); 263 | name = Main.storyboard; 264 | sourceTree = ""; 265 | }; 266 | BBDCF07E1ACA8446003352FD /* LaunchScreen.xib */ = { 267 | isa = PBXVariantGroup; 268 | children = ( 269 | BBDCF07F1ACA8446003352FD /* Base */, 270 | ); 271 | name = LaunchScreen.xib; 272 | sourceTree = ""; 273 | }; 274 | /* End PBXVariantGroup section */ 275 | 276 | /* Begin XCBuildConfiguration section */ 277 | BBDCF08D1ACA8446003352FD /* Debug */ = { 278 | isa = XCBuildConfiguration; 279 | buildSettings = { 280 | ALWAYS_SEARCH_USER_PATHS = NO; 281 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 282 | CLANG_CXX_LIBRARY = "libc++"; 283 | CLANG_ENABLE_MODULES = YES; 284 | CLANG_ENABLE_OBJC_ARC = YES; 285 | CLANG_WARN_BOOL_CONVERSION = YES; 286 | CLANG_WARN_CONSTANT_CONVERSION = YES; 287 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 288 | CLANG_WARN_EMPTY_BODY = YES; 289 | CLANG_WARN_ENUM_CONVERSION = YES; 290 | CLANG_WARN_INFINITE_RECURSION = YES; 291 | CLANG_WARN_INT_CONVERSION = YES; 292 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 293 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 294 | CLANG_WARN_UNREACHABLE_CODE = YES; 295 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 296 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 297 | COPY_PHASE_STRIP = NO; 298 | ENABLE_STRICT_OBJC_MSGSEND = YES; 299 | ENABLE_TESTABILITY = YES; 300 | GCC_C_LANGUAGE_STANDARD = gnu99; 301 | GCC_DYNAMIC_NO_PIC = NO; 302 | GCC_NO_COMMON_BLOCKS = YES; 303 | GCC_OPTIMIZATION_LEVEL = 0; 304 | GCC_PREPROCESSOR_DEFINITIONS = ( 305 | "DEBUG=1", 306 | "$(inherited)", 307 | ); 308 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 309 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 310 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 311 | GCC_WARN_UNDECLARED_SELECTOR = YES; 312 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 313 | GCC_WARN_UNUSED_FUNCTION = YES; 314 | GCC_WARN_UNUSED_VARIABLE = YES; 315 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 316 | MTL_ENABLE_DEBUG_INFO = YES; 317 | ONLY_ACTIVE_ARCH = YES; 318 | SDKROOT = iphoneos; 319 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 320 | TARGETED_DEVICE_FAMILY = "1,2"; 321 | }; 322 | name = Debug; 323 | }; 324 | BBDCF08E1ACA8446003352FD /* Release */ = { 325 | isa = XCBuildConfiguration; 326 | buildSettings = { 327 | ALWAYS_SEARCH_USER_PATHS = NO; 328 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 329 | CLANG_CXX_LIBRARY = "libc++"; 330 | CLANG_ENABLE_MODULES = YES; 331 | CLANG_ENABLE_OBJC_ARC = YES; 332 | CLANG_WARN_BOOL_CONVERSION = YES; 333 | CLANG_WARN_CONSTANT_CONVERSION = YES; 334 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INFINITE_RECURSION = YES; 338 | CLANG_WARN_INT_CONVERSION = YES; 339 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 340 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 341 | CLANG_WARN_UNREACHABLE_CODE = YES; 342 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 343 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 344 | COPY_PHASE_STRIP = NO; 345 | ENABLE_NS_ASSERTIONS = NO; 346 | ENABLE_STRICT_OBJC_MSGSEND = YES; 347 | GCC_C_LANGUAGE_STANDARD = gnu99; 348 | GCC_NO_COMMON_BLOCKS = YES; 349 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 350 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 351 | GCC_WARN_UNDECLARED_SELECTOR = YES; 352 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 353 | GCC_WARN_UNUSED_FUNCTION = YES; 354 | GCC_WARN_UNUSED_VARIABLE = YES; 355 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 356 | MTL_ENABLE_DEBUG_INFO = NO; 357 | SDKROOT = iphoneos; 358 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 359 | TARGETED_DEVICE_FAMILY = "1,2"; 360 | VALIDATE_PRODUCT = YES; 361 | }; 362 | name = Release; 363 | }; 364 | BBDCF0901ACA8446003352FD /* Debug */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 368 | CLANG_ENABLE_MODULES = YES; 369 | DEVELOPMENT_TEAM = 9V5A8WE85E; 370 | INFOPLIST_FILE = SwiftFlow/Info.plist; 371 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 372 | PRODUCT_BUNDLE_IDENTIFIER = "com.johnholdsworth.$(PRODUCT_NAME:rfc1034identifier)"; 373 | PRODUCT_NAME = SwiftFlow; 374 | SWIFT_OBJC_BRIDGING_HEADER = "SwiftFlow/SwiftFlow-Bridging-Header.h"; 375 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 376 | SWIFT_VERSION = 3.0; 377 | }; 378 | name = Debug; 379 | }; 380 | BBDCF0911ACA8446003352FD /* Release */ = { 381 | isa = XCBuildConfiguration; 382 | buildSettings = { 383 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 384 | CLANG_ENABLE_MODULES = YES; 385 | DEVELOPMENT_TEAM = 9V5A8WE85E; 386 | INFOPLIST_FILE = SwiftFlow/Info.plist; 387 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 388 | PRODUCT_BUNDLE_IDENTIFIER = "com.johnholdsworth.$(PRODUCT_NAME:rfc1034identifier)"; 389 | PRODUCT_NAME = SwiftFlow; 390 | SWIFT_OBJC_BRIDGING_HEADER = "SwiftFlow/SwiftFlow-Bridging-Header.h"; 391 | SWIFT_VERSION = 3.0; 392 | }; 393 | name = Release; 394 | }; 395 | BBDCF0931ACA8446003352FD /* Debug */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | BUNDLE_LOADER = "$(TEST_HOST)"; 399 | DEVELOPMENT_TEAM = 9V5A8WE85E; 400 | FRAMEWORK_SEARCH_PATHS = ( 401 | "$(SDKROOT)/Developer/Library/Frameworks", 402 | "$(inherited)", 403 | ); 404 | GCC_PREPROCESSOR_DEFINITIONS = ( 405 | "DEBUG=1", 406 | "$(inherited)", 407 | ); 408 | INFOPLIST_FILE = SwiftFlowTests/Info.plist; 409 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 410 | PRODUCT_BUNDLE_IDENTIFIER = "com.johnholdsworth.$(PRODUCT_NAME:rfc1034identifier)"; 411 | PRODUCT_NAME = SwiftFlowTests; 412 | SWIFT_VERSION = 3.0; 413 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftFlow.app/SwiftFlow"; 414 | }; 415 | name = Debug; 416 | }; 417 | BBDCF0941ACA8446003352FD /* Release */ = { 418 | isa = XCBuildConfiguration; 419 | buildSettings = { 420 | BUNDLE_LOADER = "$(TEST_HOST)"; 421 | DEVELOPMENT_TEAM = 9V5A8WE85E; 422 | FRAMEWORK_SEARCH_PATHS = ( 423 | "$(SDKROOT)/Developer/Library/Frameworks", 424 | "$(inherited)", 425 | ); 426 | INFOPLIST_FILE = SwiftFlowTests/Info.plist; 427 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 428 | PRODUCT_BUNDLE_IDENTIFIER = "com.johnholdsworth.$(PRODUCT_NAME:rfc1034identifier)"; 429 | PRODUCT_NAME = SwiftFlowTests; 430 | SWIFT_VERSION = 3.0; 431 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftFlow.app/SwiftFlow"; 432 | }; 433 | name = Release; 434 | }; 435 | /* End XCBuildConfiguration section */ 436 | 437 | /* Begin XCConfigurationList section */ 438 | BBDCF06B1ACA8446003352FD /* Build configuration list for PBXProject "SwiftFlow" */ = { 439 | isa = XCConfigurationList; 440 | buildConfigurations = ( 441 | BBDCF08D1ACA8446003352FD /* Debug */, 442 | BBDCF08E1ACA8446003352FD /* Release */, 443 | ); 444 | defaultConfigurationIsVisible = 0; 445 | defaultConfigurationName = Release; 446 | }; 447 | BBDCF08F1ACA8446003352FD /* Build configuration list for PBXNativeTarget "SwiftFlow" */ = { 448 | isa = XCConfigurationList; 449 | buildConfigurations = ( 450 | BBDCF0901ACA8446003352FD /* Debug */, 451 | BBDCF0911ACA8446003352FD /* Release */, 452 | ); 453 | defaultConfigurationIsVisible = 0; 454 | defaultConfigurationName = Release; 455 | }; 456 | BBDCF0921ACA8446003352FD /* Build configuration list for PBXNativeTarget "SwiftFlowTests" */ = { 457 | isa = XCConfigurationList; 458 | buildConfigurations = ( 459 | BBDCF0931ACA8446003352FD /* Debug */, 460 | BBDCF0941ACA8446003352FD /* Release */, 461 | ); 462 | defaultConfigurationIsVisible = 0; 463 | defaultConfigurationName = Release; 464 | }; 465 | /* End XCConfigurationList section */ 466 | }; 467 | rootObject = BBDCF0681ACA8446003352FD /* Project object */; 468 | } 469 | --------------------------------------------------------------------------------