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