├── SwiftKeyPath.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── johnholdsworth.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── xcuserdata
│ └── johnholdsworth.xcuserdatad
│ │ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── SwiftKeyPath.xcscheme
└── project.pbxproj
├── AnyPointer.c
├── SwiftKeyPathTests
├── Info.plist
└── SwiftKeyPathTests.swift
├── SwiftKeyPathUITests
├── Info.plist
└── SwiftKeyPathUITests.swift
├── SwiftKeyPath.swift
├── README.md
└── SwiftKeyPath
├── DetailViewController.swift
├── Assets.xcassets
└── AppIcon.appiconset
│ └── Contents.json
├── Base.lproj
├── LaunchScreen.storyboard
└── Main.storyboard
├── Info.plist
├── MasterViewController.swift
└── AppDelegate.swift
/SwiftKeyPath.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SwiftKeyPath.xcodeproj/project.xcworkspace/xcuserdata/johnholdsworth.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johnno1962/SwiftKeyPath/HEAD/SwiftKeyPath.xcodeproj/project.xcworkspace/xcuserdata/johnholdsworth.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/AnyPointer.c:
--------------------------------------------------------------------------------
1 | //
2 | // AnyPointer.c
3 | // SwiftKeyPath
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | void *_getAnyPointer( unsigned *opaquePointer, void *metadata ) {
10 | return opaquePointer;
11 | }
12 |
--------------------------------------------------------------------------------
/SwiftKeyPathTests/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 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SwiftKeyPathUITests/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 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/SwiftKeyPath.xcodeproj/xcuserdata/johnholdsworth.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | SwiftKeyPath.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | BB37F6F71E807DEB00D3DF3B
16 |
17 | primary
18 |
19 |
20 | BB37F70D1E807DEC00D3DF3B
21 |
22 | primary
23 |
24 |
25 | BB37F7181E807DEC00D3DF3B
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/SwiftKeyPath.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftKeyPath.swift
3 | // SwiftKeyPath
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | @_silgen_name("_getAnyPointer")
12 | func _getAnyPointer(_ value: T) -> UnsafeRawPointer?
13 |
14 | func getValue(keyPath:[String], type: T.Type, from: Any) -> T? {
15 | if keyPath.count == 0 {
16 | return _getAnyPointer(from)?.assumingMemoryBound(to: T.self).pointee
17 | }
18 | var keyPath = keyPath
19 | let target = keyPath[0]
20 | keyPath.remove(at: 0)
21 | for (name, child) in Mirror(reflecting: from).children {
22 | if name == target {
23 | return getValue(keyPath: keyPath, type: type, from: child)
24 | }
25 | }
26 | return nil
27 | }
28 |
29 | extension NSObject {
30 | func valueFor(keyPath:String, type: T.Type) -> T? {
31 | return getValue(keyPath: keyPath.components(separatedBy: "."), type: type, from: self)
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | ## SwiftKeyPath
3 |
4 | An implementation of valueForKeyPath for Swift classes. If your class inherits from NSObject you
5 | can use code such as the following:
6 |
7 | ```Swift
8 | var dvar = 99.0
9 | var ivar = 99
10 | var svar = "abcd"
11 |
12 | struct s {
13 | struct t {
14 | let j=88
15 | }
16 | let k = t()
17 | }
18 | var tvar = s()
19 |
20 | func application(_ application: UIApplication, didFinishLaunchingWithOptions
21 | launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
22 |
23 | print(valueFor(keyPath:"dvar", type: Double.self)!)
24 | print(valueFor(keyPath:"ivar", type: Int.self)!)
25 | print(valueFor(keyPath:"svar", type: String.self)!)
26 |
27 | print(valueFor(keyPath:"tvar.k.j", type: Int.self)!)
28 |
29 | output:
30 | 99.0
31 | 99
32 | abcd
33 | 88
34 |
35 | ```
36 |
37 | It uses Swift's Mirror class for reflection and should work for any type if you know it ahead of time.
38 | The implementation is split between the Swift Source SwiftKeyPath.swift and and a small stub of (Objective-)C.
39 |
40 | MIT Licensed.
41 |
--------------------------------------------------------------------------------
/SwiftKeyPathTests/SwiftKeyPathTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftKeyPathTests.swift
3 | // SwiftKeyPathTests
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import SwiftKeyPath
11 |
12 | class SwiftKeyPathTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | // Use XCTAssert and related functions to verify your tests produce the correct results.
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/SwiftKeyPath/DetailViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DetailViewController.swift
3 | // SwiftKeyPath
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class DetailViewController: UIViewController {
12 |
13 | @IBOutlet weak var detailDescriptionLabel: UILabel!
14 |
15 |
16 | func configureView() {
17 | // Update the user interface for the detail item.
18 | if let detail = self.detailItem {
19 | if let label = self.detailDescriptionLabel {
20 | label.text = detail.description
21 | }
22 | }
23 | }
24 |
25 | override func viewDidLoad() {
26 | super.viewDidLoad()
27 | // Do any additional setup after loading the view, typically from a nib.
28 | self.configureView()
29 | }
30 |
31 | override func didReceiveMemoryWarning() {
32 | super.didReceiveMemoryWarning()
33 | // Dispose of any resources that can be recreated.
34 | }
35 |
36 | var detailItem: NSDate? {
37 | didSet {
38 | // Update the view.
39 | self.configureView()
40 | }
41 | }
42 |
43 |
44 | }
45 |
46 |
--------------------------------------------------------------------------------
/SwiftKeyPath/Assets.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 | }
--------------------------------------------------------------------------------
/SwiftKeyPathUITests/SwiftKeyPathUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SwiftKeyPathUITests.swift
3 | // SwiftKeyPathUITests
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class SwiftKeyPathUITests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 |
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 |
18 | // In UI tests it is usually best to stop immediately when a failure occurs.
19 | continueAfterFailure = false
20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
21 | XCUIApplication().launch()
22 |
23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
24 | }
25 |
26 | override func tearDown() {
27 | // Put teardown code here. This method is called after the invocation of each test method in the class.
28 | super.tearDown()
29 | }
30 |
31 | func testExample() {
32 | // Use recording to get started writing UI tests.
33 | // Use XCTAssert and related functions to verify your tests produce the correct results.
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/SwiftKeyPath/Base.lproj/LaunchScreen.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 |
27 |
28 |
--------------------------------------------------------------------------------
/SwiftKeyPath/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 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UIStatusBarTintParameters
32 |
33 | UINavigationBar
34 |
35 | Style
36 | UIBarStyleDefault
37 | Translucent
38 |
39 |
40 |
41 | UISupportedInterfaceOrientations
42 |
43 | UIInterfaceOrientationPortrait
44 | UIInterfaceOrientationLandscapeLeft
45 | UIInterfaceOrientationLandscapeRight
46 |
47 | UISupportedInterfaceOrientations~ipad
48 |
49 | UIInterfaceOrientationPortrait
50 | UIInterfaceOrientationPortraitUpsideDown
51 | UIInterfaceOrientationLandscapeLeft
52 | UIInterfaceOrientationLandscapeRight
53 |
54 |
55 |
56 |
--------------------------------------------------------------------------------
/SwiftKeyPath/MasterViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MasterViewController.swift
3 | // SwiftKeyPath
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class MasterViewController: UITableViewController {
12 |
13 | var detailViewController: DetailViewController? = nil
14 | var objects = [Any]()
15 |
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 | // Do any additional setup after loading the view, typically from a nib.
20 | self.navigationItem.leftBarButtonItem = self.editButtonItem
21 |
22 | let addButton = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(insertNewObject(_:)))
23 | self.navigationItem.rightBarButtonItem = addButton
24 | if let split = self.splitViewController {
25 | let controllers = split.viewControllers
26 | self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
27 | }
28 | }
29 |
30 | override func viewWillAppear(_ animated: Bool) {
31 | self.clearsSelectionOnViewWillAppear = self.splitViewController!.isCollapsed
32 | super.viewWillAppear(animated)
33 | }
34 |
35 | override func didReceiveMemoryWarning() {
36 | super.didReceiveMemoryWarning()
37 | // Dispose of any resources that can be recreated.
38 | }
39 |
40 | func insertNewObject(_ sender: Any) {
41 | objects.insert(NSDate(), at: 0)
42 | let indexPath = IndexPath(row: 0, section: 0)
43 | self.tableView.insertRows(at: [indexPath], with: .automatic)
44 | }
45 |
46 | // MARK: - Segues
47 |
48 | override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
49 | if segue.identifier == "showDetail" {
50 | if let indexPath = self.tableView.indexPathForSelectedRow {
51 | let object = objects[indexPath.row] as! NSDate
52 | let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
53 | controller.detailItem = object
54 | controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
55 | controller.navigationItem.leftItemsSupplementBackButton = true
56 | }
57 | }
58 | }
59 |
60 | // MARK: - Table View
61 |
62 | override func numberOfSections(in tableView: UITableView) -> Int {
63 | return 1
64 | }
65 |
66 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
67 | return objects.count
68 | }
69 |
70 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
71 | let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
72 |
73 | let object = objects[indexPath.row] as! NSDate
74 | cell.textLabel!.text = object.description
75 | return cell
76 | }
77 |
78 | override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
79 | // Return false if you do not want the specified item to be editable.
80 | return true
81 | }
82 |
83 | override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
84 | if editingStyle == .delete {
85 | objects.remove(at: indexPath.row)
86 | tableView.deleteRows(at: [indexPath], with: .fade)
87 | } else if editingStyle == .insert {
88 | // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
89 | }
90 | }
91 |
92 |
93 | }
94 |
95 |
--------------------------------------------------------------------------------
/SwiftKeyPath/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // SwiftKeyPath
4 | //
5 | // Created by John Holdsworth on 20/03/2017.
6 | // Copyright © 2017 John Holdsworth. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate {
13 |
14 | var window: UIWindow?
15 |
16 | var dvar = 99.0
17 | var ivar = 99
18 | var svar = "abcd"
19 |
20 | struct s {
21 | struct t {
22 | let j=88
23 | }
24 | let k = t()
25 | }
26 | var tvar = s()
27 |
28 | func application(_ application: UIApplication, didFinishLaunchingWithOptions
29 | launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
30 |
31 | print(valueFor(keyPath:"dvar", type: Double.self)!)
32 | print(valueFor(keyPath:"ivar", type: Int.self)!)
33 | print(valueFor(keyPath:"svar", type: String.self)!)
34 |
35 | print(valueFor(keyPath:"tvar.k.j", type: Int.self)!)
36 |
37 | // Override point for customization after application launch.
38 | let splitViewController = self.window!.rootViewController as! UISplitViewController
39 | let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
40 | navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
41 | splitViewController.delegate = self
42 | return true
43 | }
44 |
45 | func applicationWillResignActive(_ application: UIApplication) {
46 | // 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.
47 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
48 | }
49 |
50 | func applicationDidEnterBackground(_ application: UIApplication) {
51 | // 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.
52 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
53 | }
54 |
55 | func applicationWillEnterForeground(_ application: UIApplication) {
56 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
57 | }
58 |
59 | func applicationDidBecomeActive(_ application: UIApplication) {
60 | // 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.
61 | }
62 |
63 | func applicationWillTerminate(_ application: UIApplication) {
64 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
65 | }
66 |
67 | // MARK: - Split view
68 |
69 | func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController:UIViewController, onto primaryViewController:UIViewController) -> Bool {
70 | guard let secondaryAsNavController = secondaryViewController as? UINavigationController else { return false }
71 | guard let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController else { return false }
72 | if topAsDetailController.detailItem == nil {
73 | // Return true to indicate that we have handled the collapse by doing nothing; the secondary controller will be discarded.
74 | return true
75 | }
76 | return false
77 | }
78 |
79 | }
80 |
81 |
--------------------------------------------------------------------------------
/SwiftKeyPath.xcodeproj/xcuserdata/johnholdsworth.xcuserdatad/xcschemes/SwiftKeyPath.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
43 |
49 |
50 |
51 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
74 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
95 |
101 |
102 |
103 |
104 |
106 |
107 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/SwiftKeyPath/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 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
--------------------------------------------------------------------------------
/SwiftKeyPath.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | BB37F6FC1E807DEB00D3DF3B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F6FB1E807DEB00D3DF3B /* AppDelegate.swift */; };
11 | BB37F6FE1E807DEB00D3DF3B /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F6FD1E807DEB00D3DF3B /* MasterViewController.swift */; };
12 | BB37F7001E807DEB00D3DF3B /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F6FF1E807DEB00D3DF3B /* DetailViewController.swift */; };
13 | BB37F7031E807DEB00D3DF3B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB37F7011E807DEB00D3DF3B /* Main.storyboard */; };
14 | BB37F7051E807DEB00D3DF3B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB37F7041E807DEB00D3DF3B /* Assets.xcassets */; };
15 | BB37F7081E807DEB00D3DF3B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB37F7061E807DEB00D3DF3B /* LaunchScreen.storyboard */; };
16 | BB37F7131E807DEC00D3DF3B /* SwiftKeyPathTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F7121E807DEC00D3DF3B /* SwiftKeyPathTests.swift */; };
17 | BB37F71E1E807DEC00D3DF3B /* SwiftKeyPathUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F71D1E807DEC00D3DF3B /* SwiftKeyPathUITests.swift */; };
18 | BB37F72E1E807E2B00D3DF3B /* SwiftKeyPath.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB37F72D1E807E2B00D3DF3B /* SwiftKeyPath.swift */; };
19 | BB37F7301E807E5500D3DF3B /* AnyPointer.c in Sources */ = {isa = PBXBuildFile; fileRef = BB37F72F1E807E5500D3DF3B /* AnyPointer.c */; };
20 | BB37F7321E808D8F00D3DF3B /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = BB37F7311E808D8F00D3DF3B /* README.md */; };
21 | /* End PBXBuildFile section */
22 |
23 | /* Begin PBXContainerItemProxy section */
24 | BB37F70F1E807DEC00D3DF3B /* PBXContainerItemProxy */ = {
25 | isa = PBXContainerItemProxy;
26 | containerPortal = BB37F6F01E807DEB00D3DF3B /* Project object */;
27 | proxyType = 1;
28 | remoteGlobalIDString = BB37F6F71E807DEB00D3DF3B;
29 | remoteInfo = SwiftKeyPath;
30 | };
31 | BB37F71A1E807DEC00D3DF3B /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = BB37F6F01E807DEB00D3DF3B /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = BB37F6F71E807DEB00D3DF3B;
36 | remoteInfo = SwiftKeyPath;
37 | };
38 | /* End PBXContainerItemProxy section */
39 |
40 | /* Begin PBXFileReference section */
41 | BB37F6F81E807DEB00D3DF3B /* SwiftKeyPath.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SwiftKeyPath.app; sourceTree = BUILT_PRODUCTS_DIR; };
42 | BB37F6FB1E807DEB00D3DF3B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
43 | BB37F6FD1E807DEB00D3DF3B /* MasterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterViewController.swift; sourceTree = ""; };
44 | BB37F6FF1E807DEB00D3DF3B /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; };
45 | BB37F7021E807DEB00D3DF3B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
46 | BB37F7041E807DEB00D3DF3B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
47 | BB37F7071E807DEB00D3DF3B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
48 | BB37F7091E807DEB00D3DF3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
49 | BB37F70E1E807DEC00D3DF3B /* SwiftKeyPathTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftKeyPathTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
50 | BB37F7121E807DEC00D3DF3B /* SwiftKeyPathTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftKeyPathTests.swift; sourceTree = ""; };
51 | BB37F7141E807DEC00D3DF3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
52 | BB37F7191E807DEC00D3DF3B /* SwiftKeyPathUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftKeyPathUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
53 | BB37F71D1E807DEC00D3DF3B /* SwiftKeyPathUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftKeyPathUITests.swift; sourceTree = ""; };
54 | BB37F71F1E807DEC00D3DF3B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
55 | BB37F72D1E807E2B00D3DF3B /* SwiftKeyPath.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftKeyPath.swift; sourceTree = SOURCE_ROOT; };
56 | BB37F72F1E807E5500D3DF3B /* AnyPointer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = AnyPointer.c; sourceTree = SOURCE_ROOT; };
57 | BB37F7311E808D8F00D3DF3B /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
58 | /* End PBXFileReference section */
59 |
60 | /* Begin PBXFrameworksBuildPhase section */
61 | BB37F6F51E807DEB00D3DF3B /* Frameworks */ = {
62 | isa = PBXFrameworksBuildPhase;
63 | buildActionMask = 2147483647;
64 | files = (
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | BB37F70B1E807DEC00D3DF3B /* Frameworks */ = {
69 | isa = PBXFrameworksBuildPhase;
70 | buildActionMask = 2147483647;
71 | files = (
72 | );
73 | runOnlyForDeploymentPostprocessing = 0;
74 | };
75 | BB37F7161E807DEC00D3DF3B /* Frameworks */ = {
76 | isa = PBXFrameworksBuildPhase;
77 | buildActionMask = 2147483647;
78 | files = (
79 | );
80 | runOnlyForDeploymentPostprocessing = 0;
81 | };
82 | /* End PBXFrameworksBuildPhase section */
83 |
84 | /* Begin PBXGroup section */
85 | BB37F6EF1E807DEB00D3DF3B = {
86 | isa = PBXGroup;
87 | children = (
88 | BB37F7311E808D8F00D3DF3B /* README.md */,
89 | BB37F6FA1E807DEB00D3DF3B /* SwiftKeyPath */,
90 | BB37F7111E807DEC00D3DF3B /* SwiftKeyPathTests */,
91 | BB37F71C1E807DEC00D3DF3B /* SwiftKeyPathUITests */,
92 | BB37F6F91E807DEB00D3DF3B /* Products */,
93 | );
94 | sourceTree = "";
95 | };
96 | BB37F6F91E807DEB00D3DF3B /* Products */ = {
97 | isa = PBXGroup;
98 | children = (
99 | BB37F6F81E807DEB00D3DF3B /* SwiftKeyPath.app */,
100 | BB37F70E1E807DEC00D3DF3B /* SwiftKeyPathTests.xctest */,
101 | BB37F7191E807DEC00D3DF3B /* SwiftKeyPathUITests.xctest */,
102 | );
103 | name = Products;
104 | sourceTree = "";
105 | };
106 | BB37F6FA1E807DEB00D3DF3B /* SwiftKeyPath */ = {
107 | isa = PBXGroup;
108 | children = (
109 | BB37F72F1E807E5500D3DF3B /* AnyPointer.c */,
110 | BB37F72D1E807E2B00D3DF3B /* SwiftKeyPath.swift */,
111 | BB37F6FB1E807DEB00D3DF3B /* AppDelegate.swift */,
112 | BB37F6FD1E807DEB00D3DF3B /* MasterViewController.swift */,
113 | BB37F6FF1E807DEB00D3DF3B /* DetailViewController.swift */,
114 | BB37F7011E807DEB00D3DF3B /* Main.storyboard */,
115 | BB37F7041E807DEB00D3DF3B /* Assets.xcassets */,
116 | BB37F7061E807DEB00D3DF3B /* LaunchScreen.storyboard */,
117 | BB37F7091E807DEB00D3DF3B /* Info.plist */,
118 | );
119 | path = SwiftKeyPath;
120 | sourceTree = "";
121 | };
122 | BB37F7111E807DEC00D3DF3B /* SwiftKeyPathTests */ = {
123 | isa = PBXGroup;
124 | children = (
125 | BB37F7121E807DEC00D3DF3B /* SwiftKeyPathTests.swift */,
126 | BB37F7141E807DEC00D3DF3B /* Info.plist */,
127 | );
128 | path = SwiftKeyPathTests;
129 | sourceTree = "";
130 | };
131 | BB37F71C1E807DEC00D3DF3B /* SwiftKeyPathUITests */ = {
132 | isa = PBXGroup;
133 | children = (
134 | BB37F71D1E807DEC00D3DF3B /* SwiftKeyPathUITests.swift */,
135 | BB37F71F1E807DEC00D3DF3B /* Info.plist */,
136 | );
137 | path = SwiftKeyPathUITests;
138 | sourceTree = "";
139 | };
140 | /* End PBXGroup section */
141 |
142 | /* Begin PBXNativeTarget section */
143 | BB37F6F71E807DEB00D3DF3B /* SwiftKeyPath */ = {
144 | isa = PBXNativeTarget;
145 | buildConfigurationList = BB37F7221E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPath" */;
146 | buildPhases = (
147 | BB37F6F41E807DEB00D3DF3B /* Sources */,
148 | BB37F6F51E807DEB00D3DF3B /* Frameworks */,
149 | BB37F6F61E807DEB00D3DF3B /* Resources */,
150 | );
151 | buildRules = (
152 | );
153 | dependencies = (
154 | );
155 | name = SwiftKeyPath;
156 | productName = SwiftKeyPath;
157 | productReference = BB37F6F81E807DEB00D3DF3B /* SwiftKeyPath.app */;
158 | productType = "com.apple.product-type.application";
159 | };
160 | BB37F70D1E807DEC00D3DF3B /* SwiftKeyPathTests */ = {
161 | isa = PBXNativeTarget;
162 | buildConfigurationList = BB37F7251E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPathTests" */;
163 | buildPhases = (
164 | BB37F70A1E807DEC00D3DF3B /* Sources */,
165 | BB37F70B1E807DEC00D3DF3B /* Frameworks */,
166 | BB37F70C1E807DEC00D3DF3B /* Resources */,
167 | );
168 | buildRules = (
169 | );
170 | dependencies = (
171 | BB37F7101E807DEC00D3DF3B /* PBXTargetDependency */,
172 | );
173 | name = SwiftKeyPathTests;
174 | productName = SwiftKeyPathTests;
175 | productReference = BB37F70E1E807DEC00D3DF3B /* SwiftKeyPathTests.xctest */;
176 | productType = "com.apple.product-type.bundle.unit-test";
177 | };
178 | BB37F7181E807DEC00D3DF3B /* SwiftKeyPathUITests */ = {
179 | isa = PBXNativeTarget;
180 | buildConfigurationList = BB37F7281E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPathUITests" */;
181 | buildPhases = (
182 | BB37F7151E807DEC00D3DF3B /* Sources */,
183 | BB37F7161E807DEC00D3DF3B /* Frameworks */,
184 | BB37F7171E807DEC00D3DF3B /* Resources */,
185 | );
186 | buildRules = (
187 | );
188 | dependencies = (
189 | BB37F71B1E807DEC00D3DF3B /* PBXTargetDependency */,
190 | );
191 | name = SwiftKeyPathUITests;
192 | productName = SwiftKeyPathUITests;
193 | productReference = BB37F7191E807DEC00D3DF3B /* SwiftKeyPathUITests.xctest */;
194 | productType = "com.apple.product-type.bundle.ui-testing";
195 | };
196 | /* End PBXNativeTarget section */
197 |
198 | /* Begin PBXProject section */
199 | BB37F6F01E807DEB00D3DF3B /* Project object */ = {
200 | isa = PBXProject;
201 | attributes = {
202 | LastSwiftUpdateCheck = 0820;
203 | LastUpgradeCheck = 0820;
204 | ORGANIZATIONNAME = "John Holdsworth";
205 | TargetAttributes = {
206 | BB37F6F71E807DEB00D3DF3B = {
207 | CreatedOnToolsVersion = 8.2.1;
208 | DevelopmentTeam = 9V5A8WE85E;
209 | LastSwiftMigration = 0820;
210 | ProvisioningStyle = Automatic;
211 | };
212 | BB37F70D1E807DEC00D3DF3B = {
213 | CreatedOnToolsVersion = 8.2.1;
214 | DevelopmentTeam = 9V5A8WE85E;
215 | ProvisioningStyle = Automatic;
216 | TestTargetID = BB37F6F71E807DEB00D3DF3B;
217 | };
218 | BB37F7181E807DEC00D3DF3B = {
219 | CreatedOnToolsVersion = 8.2.1;
220 | DevelopmentTeam = 9V5A8WE85E;
221 | ProvisioningStyle = Automatic;
222 | TestTargetID = BB37F6F71E807DEB00D3DF3B;
223 | };
224 | };
225 | };
226 | buildConfigurationList = BB37F6F31E807DEB00D3DF3B /* Build configuration list for PBXProject "SwiftKeyPath" */;
227 | compatibilityVersion = "Xcode 3.2";
228 | developmentRegion = English;
229 | hasScannedForEncodings = 0;
230 | knownRegions = (
231 | en,
232 | Base,
233 | );
234 | mainGroup = BB37F6EF1E807DEB00D3DF3B;
235 | productRefGroup = BB37F6F91E807DEB00D3DF3B /* Products */;
236 | projectDirPath = "";
237 | projectRoot = "";
238 | targets = (
239 | BB37F6F71E807DEB00D3DF3B /* SwiftKeyPath */,
240 | BB37F70D1E807DEC00D3DF3B /* SwiftKeyPathTests */,
241 | BB37F7181E807DEC00D3DF3B /* SwiftKeyPathUITests */,
242 | );
243 | };
244 | /* End PBXProject section */
245 |
246 | /* Begin PBXResourcesBuildPhase section */
247 | BB37F6F61E807DEB00D3DF3B /* Resources */ = {
248 | isa = PBXResourcesBuildPhase;
249 | buildActionMask = 2147483647;
250 | files = (
251 | BB37F7081E807DEB00D3DF3B /* LaunchScreen.storyboard in Resources */,
252 | BB37F7051E807DEB00D3DF3B /* Assets.xcassets in Resources */,
253 | BB37F7031E807DEB00D3DF3B /* Main.storyboard in Resources */,
254 | );
255 | runOnlyForDeploymentPostprocessing = 0;
256 | };
257 | BB37F70C1E807DEC00D3DF3B /* Resources */ = {
258 | isa = PBXResourcesBuildPhase;
259 | buildActionMask = 2147483647;
260 | files = (
261 | );
262 | runOnlyForDeploymentPostprocessing = 0;
263 | };
264 | BB37F7171E807DEC00D3DF3B /* Resources */ = {
265 | isa = PBXResourcesBuildPhase;
266 | buildActionMask = 2147483647;
267 | files = (
268 | );
269 | runOnlyForDeploymentPostprocessing = 0;
270 | };
271 | /* End PBXResourcesBuildPhase section */
272 |
273 | /* Begin PBXSourcesBuildPhase section */
274 | BB37F6F41E807DEB00D3DF3B /* Sources */ = {
275 | isa = PBXSourcesBuildPhase;
276 | buildActionMask = 2147483647;
277 | files = (
278 | BB37F7321E808D8F00D3DF3B /* README.md in Sources */,
279 | BB37F7001E807DEB00D3DF3B /* DetailViewController.swift in Sources */,
280 | BB37F72E1E807E2B00D3DF3B /* SwiftKeyPath.swift in Sources */,
281 | BB37F6FE1E807DEB00D3DF3B /* MasterViewController.swift in Sources */,
282 | BB37F6FC1E807DEB00D3DF3B /* AppDelegate.swift in Sources */,
283 | BB37F7301E807E5500D3DF3B /* AnyPointer.c in Sources */,
284 | );
285 | runOnlyForDeploymentPostprocessing = 0;
286 | };
287 | BB37F70A1E807DEC00D3DF3B /* Sources */ = {
288 | isa = PBXSourcesBuildPhase;
289 | buildActionMask = 2147483647;
290 | files = (
291 | BB37F7131E807DEC00D3DF3B /* SwiftKeyPathTests.swift in Sources */,
292 | );
293 | runOnlyForDeploymentPostprocessing = 0;
294 | };
295 | BB37F7151E807DEC00D3DF3B /* Sources */ = {
296 | isa = PBXSourcesBuildPhase;
297 | buildActionMask = 2147483647;
298 | files = (
299 | BB37F71E1E807DEC00D3DF3B /* SwiftKeyPathUITests.swift in Sources */,
300 | );
301 | runOnlyForDeploymentPostprocessing = 0;
302 | };
303 | /* End PBXSourcesBuildPhase section */
304 |
305 | /* Begin PBXTargetDependency section */
306 | BB37F7101E807DEC00D3DF3B /* PBXTargetDependency */ = {
307 | isa = PBXTargetDependency;
308 | target = BB37F6F71E807DEB00D3DF3B /* SwiftKeyPath */;
309 | targetProxy = BB37F70F1E807DEC00D3DF3B /* PBXContainerItemProxy */;
310 | };
311 | BB37F71B1E807DEC00D3DF3B /* PBXTargetDependency */ = {
312 | isa = PBXTargetDependency;
313 | target = BB37F6F71E807DEB00D3DF3B /* SwiftKeyPath */;
314 | targetProxy = BB37F71A1E807DEC00D3DF3B /* PBXContainerItemProxy */;
315 | };
316 | /* End PBXTargetDependency section */
317 |
318 | /* Begin PBXVariantGroup section */
319 | BB37F7011E807DEB00D3DF3B /* Main.storyboard */ = {
320 | isa = PBXVariantGroup;
321 | children = (
322 | BB37F7021E807DEB00D3DF3B /* Base */,
323 | );
324 | name = Main.storyboard;
325 | sourceTree = "";
326 | };
327 | BB37F7061E807DEB00D3DF3B /* LaunchScreen.storyboard */ = {
328 | isa = PBXVariantGroup;
329 | children = (
330 | BB37F7071E807DEB00D3DF3B /* Base */,
331 | );
332 | name = LaunchScreen.storyboard;
333 | sourceTree = "";
334 | };
335 | /* End PBXVariantGroup section */
336 |
337 | /* Begin XCBuildConfiguration section */
338 | BB37F7201E807DEC00D3DF3B /* Debug */ = {
339 | isa = XCBuildConfiguration;
340 | buildSettings = {
341 | ALWAYS_SEARCH_USER_PATHS = NO;
342 | CLANG_ANALYZER_NONNULL = YES;
343 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
344 | CLANG_CXX_LIBRARY = "libc++";
345 | CLANG_ENABLE_MODULES = YES;
346 | CLANG_ENABLE_OBJC_ARC = YES;
347 | CLANG_WARN_BOOL_CONVERSION = YES;
348 | CLANG_WARN_CONSTANT_CONVERSION = YES;
349 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
350 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
351 | CLANG_WARN_EMPTY_BODY = YES;
352 | CLANG_WARN_ENUM_CONVERSION = YES;
353 | CLANG_WARN_INFINITE_RECURSION = YES;
354 | CLANG_WARN_INT_CONVERSION = YES;
355 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
356 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
357 | CLANG_WARN_UNREACHABLE_CODE = YES;
358 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
359 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
360 | COPY_PHASE_STRIP = NO;
361 | DEBUG_INFORMATION_FORMAT = dwarf;
362 | ENABLE_STRICT_OBJC_MSGSEND = YES;
363 | ENABLE_TESTABILITY = YES;
364 | GCC_C_LANGUAGE_STANDARD = gnu99;
365 | GCC_DYNAMIC_NO_PIC = NO;
366 | GCC_NO_COMMON_BLOCKS = YES;
367 | GCC_OPTIMIZATION_LEVEL = 0;
368 | GCC_PREPROCESSOR_DEFINITIONS = (
369 | "DEBUG=1",
370 | "$(inherited)",
371 | );
372 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
373 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
374 | GCC_WARN_UNDECLARED_SELECTOR = YES;
375 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
376 | GCC_WARN_UNUSED_FUNCTION = YES;
377 | GCC_WARN_UNUSED_VARIABLE = YES;
378 | IPHONEOS_DEPLOYMENT_TARGET = 10.2;
379 | MTL_ENABLE_DEBUG_INFO = YES;
380 | ONLY_ACTIVE_ARCH = YES;
381 | SDKROOT = iphoneos;
382 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
383 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
384 | TARGETED_DEVICE_FAMILY = "1,2";
385 | };
386 | name = Debug;
387 | };
388 | BB37F7211E807DEC00D3DF3B /* Release */ = {
389 | isa = XCBuildConfiguration;
390 | buildSettings = {
391 | ALWAYS_SEARCH_USER_PATHS = NO;
392 | CLANG_ANALYZER_NONNULL = YES;
393 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
394 | CLANG_CXX_LIBRARY = "libc++";
395 | CLANG_ENABLE_MODULES = YES;
396 | CLANG_ENABLE_OBJC_ARC = YES;
397 | CLANG_WARN_BOOL_CONVERSION = YES;
398 | CLANG_WARN_CONSTANT_CONVERSION = YES;
399 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
400 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
401 | CLANG_WARN_EMPTY_BODY = YES;
402 | CLANG_WARN_ENUM_CONVERSION = YES;
403 | CLANG_WARN_INFINITE_RECURSION = YES;
404 | CLANG_WARN_INT_CONVERSION = YES;
405 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
406 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
407 | CLANG_WARN_UNREACHABLE_CODE = YES;
408 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
409 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
410 | COPY_PHASE_STRIP = NO;
411 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
412 | ENABLE_NS_ASSERTIONS = NO;
413 | ENABLE_STRICT_OBJC_MSGSEND = YES;
414 | GCC_C_LANGUAGE_STANDARD = gnu99;
415 | GCC_NO_COMMON_BLOCKS = YES;
416 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
417 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
418 | GCC_WARN_UNDECLARED_SELECTOR = YES;
419 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
420 | GCC_WARN_UNUSED_FUNCTION = YES;
421 | GCC_WARN_UNUSED_VARIABLE = YES;
422 | IPHONEOS_DEPLOYMENT_TARGET = 10.2;
423 | MTL_ENABLE_DEBUG_INFO = NO;
424 | SDKROOT = iphoneos;
425 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
426 | TARGETED_DEVICE_FAMILY = "1,2";
427 | VALIDATE_PRODUCT = YES;
428 | };
429 | name = Release;
430 | };
431 | BB37F7231E807DEC00D3DF3B /* Debug */ = {
432 | isa = XCBuildConfiguration;
433 | buildSettings = {
434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
435 | CLANG_ENABLE_MODULES = YES;
436 | DEVELOPMENT_TEAM = 9V5A8WE85E;
437 | INFOPLIST_FILE = SwiftKeyPath/Info.plist;
438 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
439 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPath;
440 | PRODUCT_NAME = "$(TARGET_NAME)";
441 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
442 | SWIFT_VERSION = 3.0;
443 | };
444 | name = Debug;
445 | };
446 | BB37F7241E807DEC00D3DF3B /* Release */ = {
447 | isa = XCBuildConfiguration;
448 | buildSettings = {
449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
450 | CLANG_ENABLE_MODULES = YES;
451 | DEVELOPMENT_TEAM = 9V5A8WE85E;
452 | INFOPLIST_FILE = SwiftKeyPath/Info.plist;
453 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
454 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPath;
455 | PRODUCT_NAME = "$(TARGET_NAME)";
456 | SWIFT_VERSION = 3.0;
457 | };
458 | name = Release;
459 | };
460 | BB37F7261E807DEC00D3DF3B /* Debug */ = {
461 | isa = XCBuildConfiguration;
462 | buildSettings = {
463 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
464 | BUNDLE_LOADER = "$(TEST_HOST)";
465 | DEVELOPMENT_TEAM = 9V5A8WE85E;
466 | INFOPLIST_FILE = SwiftKeyPathTests/Info.plist;
467 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
468 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPathTests;
469 | PRODUCT_NAME = "$(TARGET_NAME)";
470 | SWIFT_VERSION = 3.0;
471 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftKeyPath.app/SwiftKeyPath";
472 | };
473 | name = Debug;
474 | };
475 | BB37F7271E807DEC00D3DF3B /* Release */ = {
476 | isa = XCBuildConfiguration;
477 | buildSettings = {
478 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
479 | BUNDLE_LOADER = "$(TEST_HOST)";
480 | DEVELOPMENT_TEAM = 9V5A8WE85E;
481 | INFOPLIST_FILE = SwiftKeyPathTests/Info.plist;
482 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
483 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPathTests;
484 | PRODUCT_NAME = "$(TARGET_NAME)";
485 | SWIFT_VERSION = 3.0;
486 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftKeyPath.app/SwiftKeyPath";
487 | };
488 | name = Release;
489 | };
490 | BB37F7291E807DEC00D3DF3B /* Debug */ = {
491 | isa = XCBuildConfiguration;
492 | buildSettings = {
493 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
494 | DEVELOPMENT_TEAM = 9V5A8WE85E;
495 | INFOPLIST_FILE = SwiftKeyPathUITests/Info.plist;
496 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
497 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPathUITests;
498 | PRODUCT_NAME = "$(TARGET_NAME)";
499 | SWIFT_VERSION = 3.0;
500 | TEST_TARGET_NAME = SwiftKeyPath;
501 | };
502 | name = Debug;
503 | };
504 | BB37F72A1E807DEC00D3DF3B /* Release */ = {
505 | isa = XCBuildConfiguration;
506 | buildSettings = {
507 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
508 | DEVELOPMENT_TEAM = 9V5A8WE85E;
509 | INFOPLIST_FILE = SwiftKeyPathUITests/Info.plist;
510 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
511 | PRODUCT_BUNDLE_IDENTIFIER = com.johnholdsworth.SwiftKeyPathUITests;
512 | PRODUCT_NAME = "$(TARGET_NAME)";
513 | SWIFT_VERSION = 3.0;
514 | TEST_TARGET_NAME = SwiftKeyPath;
515 | };
516 | name = Release;
517 | };
518 | /* End XCBuildConfiguration section */
519 |
520 | /* Begin XCConfigurationList section */
521 | BB37F6F31E807DEB00D3DF3B /* Build configuration list for PBXProject "SwiftKeyPath" */ = {
522 | isa = XCConfigurationList;
523 | buildConfigurations = (
524 | BB37F7201E807DEC00D3DF3B /* Debug */,
525 | BB37F7211E807DEC00D3DF3B /* Release */,
526 | );
527 | defaultConfigurationIsVisible = 0;
528 | defaultConfigurationName = Release;
529 | };
530 | BB37F7221E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPath" */ = {
531 | isa = XCConfigurationList;
532 | buildConfigurations = (
533 | BB37F7231E807DEC00D3DF3B /* Debug */,
534 | BB37F7241E807DEC00D3DF3B /* Release */,
535 | );
536 | defaultConfigurationIsVisible = 0;
537 | };
538 | BB37F7251E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPathTests" */ = {
539 | isa = XCConfigurationList;
540 | buildConfigurations = (
541 | BB37F7261E807DEC00D3DF3B /* Debug */,
542 | BB37F7271E807DEC00D3DF3B /* Release */,
543 | );
544 | defaultConfigurationIsVisible = 0;
545 | };
546 | BB37F7281E807DEC00D3DF3B /* Build configuration list for PBXNativeTarget "SwiftKeyPathUITests" */ = {
547 | isa = XCConfigurationList;
548 | buildConfigurations = (
549 | BB37F7291E807DEC00D3DF3B /* Debug */,
550 | BB37F72A1E807DEC00D3DF3B /* Release */,
551 | );
552 | defaultConfigurationIsVisible = 0;
553 | };
554 | /* End XCConfigurationList section */
555 | };
556 | rootObject = BB37F6F01E807DEB00D3DF3B /* Project object */;
557 | }
558 |
--------------------------------------------------------------------------------