├── 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 |
--------------------------------------------------------------------------------