├── .gitignore ├── README.md ├── TodoList.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── TodoList ├── AppDelegate.swift ├── Images.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── LaunchImage.launchimage │ │ └── Contents.json ├── NewTodoViewController.swift ├── Info.plist ├── ListViewController.swift └── Base.lproj │ └── Main.storyboard └── TodoListTests ├── Info.plist └── TodoListTests.swift /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | xcuserdata 3 | *.pbxuser 4 | archives 5 | project.xcworkspace/ 6 | .DS_Store 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | TodoList 2 | ======== 3 | 4 | A sample todo list application written in Swift 5 | 6 | This application was written for a workshop at gSchool. 7 | -------------------------------------------------------------------------------- /TodoList.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /TodoList/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | @UIApplicationMain 4 | class AppDelegate: UIResponder, UIApplicationDelegate { 5 | 6 | var window: UIWindow? 7 | 8 | func application(application: UIApplication!, didFinishLaunchingWithOptions launchOptions: NSDictionary!) -> Bool { 9 | return true 10 | } 11 | } 12 | 13 | -------------------------------------------------------------------------------- /TodoListTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gospotcheck.$(PRODUCT_NAME:rfc1034identifier) 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 | -------------------------------------------------------------------------------- /TodoListTests/TodoListTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoListTests.swift 3 | // TodoListTests 4 | // 5 | // Created by Sean Dougherty on 8/19/14. 6 | // Copyright (c) 2014 GoSpotCheck. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import XCTest 11 | 12 | class TodoListTests: 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 | XCTAssert(true, "Pass") 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measureBlock() { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /TodoList/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" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "ipad", 20 | "size" : "29x29", 21 | "scale" : "1x" 22 | }, 23 | { 24 | "idiom" : "ipad", 25 | "size" : "29x29", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "ipad", 30 | "size" : "40x40", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "idiom" : "ipad", 35 | "size" : "40x40", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "ipad", 40 | "size" : "76x76", 41 | "scale" : "1x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "76x76", 46 | "scale" : "2x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } -------------------------------------------------------------------------------- /TodoList/NewTodoViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | protocol NewTodoDelegate { 4 | func todoSaved(todo:String) 5 | } 6 | 7 | class NewTodoViewController: UIViewController { 8 | 9 | @IBOutlet var input: UITextField! 10 | var delegate:NewTodoDelegate! 11 | 12 | override func viewDidLoad() { 13 | super.viewDidLoad() 14 | self.title = "Add Todo" 15 | self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: self, action: "cancelTapped:") 16 | self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Save, target: self, action: "saveTapped:") 17 | } 18 | 19 | override func viewDidAppear(animated: Bool) { 20 | super.viewDidAppear(animated) 21 | input.becomeFirstResponder() 22 | } 23 | 24 | @IBAction func cancelTapped(AnyObject) { 25 | dismissViewControllerAnimated(true, completion: nil) 26 | } 27 | 28 | @IBAction func saveTapped(AnyObject) { 29 | if let totoDelegate = delegate { 30 | delegate.todoSaved(input.text) 31 | } 32 | dismissViewControllerAnimated(true, completion: { () -> Void in 33 | self.delegate = nil 34 | }) 35 | } 36 | } -------------------------------------------------------------------------------- /TodoList/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "orientation" : "portrait", 20 | "idiom" : "ipad", 21 | "extent" : "full-screen", 22 | "minimum-system-version" : "7.0", 23 | "scale" : "1x" 24 | }, 25 | { 26 | "orientation" : "landscape", 27 | "idiom" : "ipad", 28 | "extent" : "full-screen", 29 | "minimum-system-version" : "7.0", 30 | "scale" : "1x" 31 | }, 32 | { 33 | "orientation" : "portrait", 34 | "idiom" : "ipad", 35 | "extent" : "full-screen", 36 | "minimum-system-version" : "7.0", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "orientation" : "landscape", 41 | "idiom" : "ipad", 42 | "extent" : "full-screen", 43 | "minimum-system-version" : "7.0", 44 | "scale" : "2x" 45 | } 46 | ], 47 | "info" : { 48 | "version" : 1, 49 | "author" : "xcode" 50 | } 51 | } -------------------------------------------------------------------------------- /TodoList/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | com.gospotcheck.$(PRODUCT_NAME:rfc1034identifier) 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 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /TodoList/ListViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class ListViewController: UITableViewController, NewTodoDelegate { 4 | 5 | var items = ["Mow the lawn", "Get a haircut", "Take a nap"] 6 | 7 | override func viewDidLoad() { 8 | super.viewDidLoad() 9 | 10 | tableView.allowsSelection = false 11 | self.title = "gTodo" 12 | setupNavItems() 13 | } 14 | 15 | func setupNavItems() { 16 | navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Edit, target: self, action: "editTableTapped:") 17 | navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "addItemTapped:") 18 | } 19 | 20 | @IBAction func editTableTapped(AnyObject) { 21 | tableView.setEditing(!tableView.editing, animated: true) 22 | } 23 | 24 | @IBAction func addItemTapped(AnyObject) { 25 | let storyboard = UIStoryboard(name: "Main", bundle: nil) 26 | let navController: UINavigationController = storyboard.instantiateViewControllerWithIdentifier("NewTodoViewController") as UINavigationController 27 | let todoController: NewTodoViewController = navController.topViewController as NewTodoViewController 28 | todoController.delegate = self 29 | 30 | presentViewController(navController, animated: true, completion: nil) 31 | } 32 | 33 | func todoSaved(todo: String) { 34 | items.insert(todo, atIndex: 0) 35 | 36 | tableView.beginUpdates() 37 | tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: 0, inSection: 0)], withRowAnimation: .Top) 38 | tableView.endUpdates() 39 | } 40 | 41 | override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 42 | return items.count 43 | } 44 | 45 | override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { 46 | let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "ListCell") 47 | 48 | cell.textLabel.text = items[indexPath.row] 49 | 50 | return cell 51 | } 52 | 53 | override func tableView(tableView: UITableView!, canEditRowAtIndexPath indexPath: NSIndexPath!) -> Bool { 54 | return true 55 | } 56 | 57 | override func tableView(tableView: UITableView!, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath!) { 58 | switch editingStyle { 59 | case .Delete: 60 | items.removeAtIndex(indexPath.row) 61 | tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Top) 62 | case .Insert, .None: 63 | println("Nothing to do") 64 | } 65 | } 66 | 67 | override func tableView(tableView: UITableView!, canMoveRowAtIndexPath indexPath: NSIndexPath!) -> Bool { 68 | return true 69 | } 70 | 71 | override func tableView(tableView: UITableView!, moveRowAtIndexPath sourceIndexPath: NSIndexPath!, toIndexPath destinationIndexPath: NSIndexPath!) { 72 | let toDo = items[sourceIndexPath.row] 73 | items.removeAtIndex(sourceIndexPath.row) 74 | items.insert(toDo, atIndex: destinationIndexPath.row) 75 | } 76 | } -------------------------------------------------------------------------------- /TodoList/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 | 36 | 37 | 38 | 39 | 40 | 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 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /TodoList.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 141DEE6719A385B6009C0CD9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 141DEE6619A385B6009C0CD9 /* AppDelegate.swift */; }; 11 | 141DEE6C19A385B6009C0CD9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 141DEE6A19A385B6009C0CD9 /* Main.storyboard */; }; 12 | 141DEE6E19A385B6009C0CD9 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 141DEE6D19A385B6009C0CD9 /* Images.xcassets */; }; 13 | 141DEE7A19A385B6009C0CD9 /* TodoListTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 141DEE7919A385B6009C0CD9 /* TodoListTests.swift */; }; 14 | 141DEE8419A3885F009C0CD9 /* ListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 141DEE8319A3885F009C0CD9 /* ListViewController.swift */; }; 15 | 145AD09919A3F335006573B9 /* NewTodoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 145AD09819A3F335006573B9 /* NewTodoViewController.swift */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXContainerItemProxy section */ 19 | 141DEE7419A385B6009C0CD9 /* PBXContainerItemProxy */ = { 20 | isa = PBXContainerItemProxy; 21 | containerPortal = 141DEE5919A385B5009C0CD9 /* Project object */; 22 | proxyType = 1; 23 | remoteGlobalIDString = 141DEE6019A385B6009C0CD9; 24 | remoteInfo = TodoList; 25 | }; 26 | /* End PBXContainerItemProxy section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 141DEE6119A385B6009C0CD9 /* TodoList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TodoList.app; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 141DEE6519A385B6009C0CD9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 31 | 141DEE6619A385B6009C0CD9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 32 | 141DEE6B19A385B6009C0CD9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 33 | 141DEE6D19A385B6009C0CD9 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 34 | 141DEE7319A385B6009C0CD9 /* TodoListTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TodoListTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 35 | 141DEE7819A385B6009C0CD9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 36 | 141DEE7919A385B6009C0CD9 /* TodoListTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoListTests.swift; sourceTree = ""; }; 37 | 141DEE8319A3885F009C0CD9 /* ListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewController.swift; sourceTree = ""; }; 38 | 145AD09819A3F335006573B9 /* NewTodoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewTodoViewController.swift; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | 141DEE5E19A385B6009C0CD9 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | 141DEE7019A385B6009C0CD9 /* Frameworks */ = { 50 | isa = PBXFrameworksBuildPhase; 51 | buildActionMask = 2147483647; 52 | files = ( 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 141DEE5819A385B5009C0CD9 = { 60 | isa = PBXGroup; 61 | children = ( 62 | 141DEE6319A385B6009C0CD9 /* TodoList */, 63 | 141DEE7619A385B6009C0CD9 /* TodoListTests */, 64 | 141DEE6219A385B6009C0CD9 /* Products */, 65 | ); 66 | sourceTree = ""; 67 | }; 68 | 141DEE6219A385B6009C0CD9 /* Products */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 141DEE6119A385B6009C0CD9 /* TodoList.app */, 72 | 141DEE7319A385B6009C0CD9 /* TodoListTests.xctest */, 73 | ); 74 | name = Products; 75 | sourceTree = ""; 76 | }; 77 | 141DEE6319A385B6009C0CD9 /* TodoList */ = { 78 | isa = PBXGroup; 79 | children = ( 80 | 141DEE6619A385B6009C0CD9 /* AppDelegate.swift */, 81 | 141DEE6A19A385B6009C0CD9 /* Main.storyboard */, 82 | 141DEE6D19A385B6009C0CD9 /* Images.xcassets */, 83 | 141DEE6419A385B6009C0CD9 /* Supporting Files */, 84 | 141DEE8319A3885F009C0CD9 /* ListViewController.swift */, 85 | 145AD09819A3F335006573B9 /* NewTodoViewController.swift */, 86 | ); 87 | path = TodoList; 88 | sourceTree = ""; 89 | }; 90 | 141DEE6419A385B6009C0CD9 /* Supporting Files */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 141DEE6519A385B6009C0CD9 /* Info.plist */, 94 | ); 95 | name = "Supporting Files"; 96 | sourceTree = ""; 97 | }; 98 | 141DEE7619A385B6009C0CD9 /* TodoListTests */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 141DEE7919A385B6009C0CD9 /* TodoListTests.swift */, 102 | 141DEE7719A385B6009C0CD9 /* Supporting Files */, 103 | ); 104 | path = TodoListTests; 105 | sourceTree = ""; 106 | }; 107 | 141DEE7719A385B6009C0CD9 /* Supporting Files */ = { 108 | isa = PBXGroup; 109 | children = ( 110 | 141DEE7819A385B6009C0CD9 /* Info.plist */, 111 | ); 112 | name = "Supporting Files"; 113 | sourceTree = ""; 114 | }; 115 | /* End PBXGroup section */ 116 | 117 | /* Begin PBXNativeTarget section */ 118 | 141DEE6019A385B6009C0CD9 /* TodoList */ = { 119 | isa = PBXNativeTarget; 120 | buildConfigurationList = 141DEE7D19A385B6009C0CD9 /* Build configuration list for PBXNativeTarget "TodoList" */; 121 | buildPhases = ( 122 | 141DEE5D19A385B6009C0CD9 /* Sources */, 123 | 141DEE5E19A385B6009C0CD9 /* Frameworks */, 124 | 141DEE5F19A385B6009C0CD9 /* Resources */, 125 | ); 126 | buildRules = ( 127 | ); 128 | dependencies = ( 129 | ); 130 | name = TodoList; 131 | productName = TodoList; 132 | productReference = 141DEE6119A385B6009C0CD9 /* TodoList.app */; 133 | productType = "com.apple.product-type.application"; 134 | }; 135 | 141DEE7219A385B6009C0CD9 /* TodoListTests */ = { 136 | isa = PBXNativeTarget; 137 | buildConfigurationList = 141DEE8019A385B6009C0CD9 /* Build configuration list for PBXNativeTarget "TodoListTests" */; 138 | buildPhases = ( 139 | 141DEE6F19A385B6009C0CD9 /* Sources */, 140 | 141DEE7019A385B6009C0CD9 /* Frameworks */, 141 | 141DEE7119A385B6009C0CD9 /* Resources */, 142 | ); 143 | buildRules = ( 144 | ); 145 | dependencies = ( 146 | 141DEE7519A385B6009C0CD9 /* PBXTargetDependency */, 147 | ); 148 | name = TodoListTests; 149 | productName = TodoListTests; 150 | productReference = 141DEE7319A385B6009C0CD9 /* TodoListTests.xctest */; 151 | productType = "com.apple.product-type.bundle.unit-test"; 152 | }; 153 | /* End PBXNativeTarget section */ 154 | 155 | /* Begin PBXProject section */ 156 | 141DEE5919A385B5009C0CD9 /* Project object */ = { 157 | isa = PBXProject; 158 | attributes = { 159 | LastUpgradeCheck = 0600; 160 | ORGANIZATIONNAME = GoSpotCheck; 161 | TargetAttributes = { 162 | 141DEE6019A385B6009C0CD9 = { 163 | CreatedOnToolsVersion = 6.0; 164 | }; 165 | 141DEE7219A385B6009C0CD9 = { 166 | CreatedOnToolsVersion = 6.0; 167 | TestTargetID = 141DEE6019A385B6009C0CD9; 168 | }; 169 | }; 170 | }; 171 | buildConfigurationList = 141DEE5C19A385B5009C0CD9 /* Build configuration list for PBXProject "TodoList" */; 172 | compatibilityVersion = "Xcode 3.2"; 173 | developmentRegion = English; 174 | hasScannedForEncodings = 0; 175 | knownRegions = ( 176 | en, 177 | Base, 178 | ); 179 | mainGroup = 141DEE5819A385B5009C0CD9; 180 | productRefGroup = 141DEE6219A385B6009C0CD9 /* Products */; 181 | projectDirPath = ""; 182 | projectRoot = ""; 183 | targets = ( 184 | 141DEE6019A385B6009C0CD9 /* TodoList */, 185 | 141DEE7219A385B6009C0CD9 /* TodoListTests */, 186 | ); 187 | }; 188 | /* End PBXProject section */ 189 | 190 | /* Begin PBXResourcesBuildPhase section */ 191 | 141DEE5F19A385B6009C0CD9 /* Resources */ = { 192 | isa = PBXResourcesBuildPhase; 193 | buildActionMask = 2147483647; 194 | files = ( 195 | 141DEE6C19A385B6009C0CD9 /* Main.storyboard in Resources */, 196 | 141DEE6E19A385B6009C0CD9 /* Images.xcassets in Resources */, 197 | ); 198 | runOnlyForDeploymentPostprocessing = 0; 199 | }; 200 | 141DEE7119A385B6009C0CD9 /* Resources */ = { 201 | isa = PBXResourcesBuildPhase; 202 | buildActionMask = 2147483647; 203 | files = ( 204 | ); 205 | runOnlyForDeploymentPostprocessing = 0; 206 | }; 207 | /* End PBXResourcesBuildPhase section */ 208 | 209 | /* Begin PBXSourcesBuildPhase section */ 210 | 141DEE5D19A385B6009C0CD9 /* Sources */ = { 211 | isa = PBXSourcesBuildPhase; 212 | buildActionMask = 2147483647; 213 | files = ( 214 | 141DEE6719A385B6009C0CD9 /* AppDelegate.swift in Sources */, 215 | 145AD09919A3F335006573B9 /* NewTodoViewController.swift in Sources */, 216 | 141DEE8419A3885F009C0CD9 /* ListViewController.swift in Sources */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | 141DEE6F19A385B6009C0CD9 /* Sources */ = { 221 | isa = PBXSourcesBuildPhase; 222 | buildActionMask = 2147483647; 223 | files = ( 224 | 141DEE7A19A385B6009C0CD9 /* TodoListTests.swift in Sources */, 225 | ); 226 | runOnlyForDeploymentPostprocessing = 0; 227 | }; 228 | /* End PBXSourcesBuildPhase section */ 229 | 230 | /* Begin PBXTargetDependency section */ 231 | 141DEE7519A385B6009C0CD9 /* PBXTargetDependency */ = { 232 | isa = PBXTargetDependency; 233 | target = 141DEE6019A385B6009C0CD9 /* TodoList */; 234 | targetProxy = 141DEE7419A385B6009C0CD9 /* PBXContainerItemProxy */; 235 | }; 236 | /* End PBXTargetDependency section */ 237 | 238 | /* Begin PBXVariantGroup section */ 239 | 141DEE6A19A385B6009C0CD9 /* Main.storyboard */ = { 240 | isa = PBXVariantGroup; 241 | children = ( 242 | 141DEE6B19A385B6009C0CD9 /* Base */, 243 | ); 244 | name = Main.storyboard; 245 | sourceTree = ""; 246 | }; 247 | /* End PBXVariantGroup section */ 248 | 249 | /* Begin XCBuildConfiguration section */ 250 | 141DEE7B19A385B6009C0CD9 /* Debug */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | ALWAYS_SEARCH_USER_PATHS = NO; 254 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 255 | CLANG_CXX_LIBRARY = "libc++"; 256 | CLANG_ENABLE_MODULES = YES; 257 | CLANG_ENABLE_OBJC_ARC = YES; 258 | CLANG_WARN_BOOL_CONVERSION = YES; 259 | CLANG_WARN_CONSTANT_CONVERSION = YES; 260 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 261 | CLANG_WARN_EMPTY_BODY = YES; 262 | CLANG_WARN_ENUM_CONVERSION = YES; 263 | CLANG_WARN_INT_CONVERSION = YES; 264 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 265 | CLANG_WARN_UNREACHABLE_CODE = YES; 266 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 267 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 268 | COPY_PHASE_STRIP = NO; 269 | ENABLE_STRICT_OBJC_MSGSEND = YES; 270 | GCC_C_LANGUAGE_STANDARD = gnu99; 271 | GCC_DYNAMIC_NO_PIC = NO; 272 | GCC_OPTIMIZATION_LEVEL = 0; 273 | GCC_PREPROCESSOR_DEFINITIONS = ( 274 | "DEBUG=1", 275 | "$(inherited)", 276 | ); 277 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 278 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 279 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 280 | GCC_WARN_UNDECLARED_SELECTOR = YES; 281 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 282 | GCC_WARN_UNUSED_FUNCTION = YES; 283 | GCC_WARN_UNUSED_VARIABLE = YES; 284 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 285 | MTL_ENABLE_DEBUG_INFO = YES; 286 | ONLY_ACTIVE_ARCH = YES; 287 | SDKROOT = iphoneos; 288 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 289 | TARGETED_DEVICE_FAMILY = "1,2"; 290 | }; 291 | name = Debug; 292 | }; 293 | 141DEE7C19A385B6009C0CD9 /* Release */ = { 294 | isa = XCBuildConfiguration; 295 | buildSettings = { 296 | ALWAYS_SEARCH_USER_PATHS = NO; 297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 298 | CLANG_CXX_LIBRARY = "libc++"; 299 | CLANG_ENABLE_MODULES = YES; 300 | CLANG_ENABLE_OBJC_ARC = YES; 301 | CLANG_WARN_BOOL_CONVERSION = YES; 302 | CLANG_WARN_CONSTANT_CONVERSION = YES; 303 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 304 | CLANG_WARN_EMPTY_BODY = YES; 305 | CLANG_WARN_ENUM_CONVERSION = YES; 306 | CLANG_WARN_INT_CONVERSION = YES; 307 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 308 | CLANG_WARN_UNREACHABLE_CODE = YES; 309 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 310 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 311 | COPY_PHASE_STRIP = YES; 312 | ENABLE_NS_ASSERTIONS = NO; 313 | ENABLE_STRICT_OBJC_MSGSEND = YES; 314 | GCC_C_LANGUAGE_STANDARD = gnu99; 315 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 316 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 317 | GCC_WARN_UNDECLARED_SELECTOR = YES; 318 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 319 | GCC_WARN_UNUSED_FUNCTION = YES; 320 | GCC_WARN_UNUSED_VARIABLE = YES; 321 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 322 | MTL_ENABLE_DEBUG_INFO = NO; 323 | SDKROOT = iphoneos; 324 | TARGETED_DEVICE_FAMILY = "1,2"; 325 | VALIDATE_PRODUCT = YES; 326 | }; 327 | name = Release; 328 | }; 329 | 141DEE7E19A385B6009C0CD9 /* Debug */ = { 330 | isa = XCBuildConfiguration; 331 | buildSettings = { 332 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 333 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 334 | INFOPLIST_FILE = TodoList/Info.plist; 335 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 336 | PRODUCT_NAME = "$(TARGET_NAME)"; 337 | }; 338 | name = Debug; 339 | }; 340 | 141DEE7F19A385B6009C0CD9 /* Release */ = { 341 | isa = XCBuildConfiguration; 342 | buildSettings = { 343 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 344 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 345 | INFOPLIST_FILE = TodoList/Info.plist; 346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 347 | PRODUCT_NAME = "$(TARGET_NAME)"; 348 | }; 349 | name = Release; 350 | }; 351 | 141DEE8119A385B6009C0CD9 /* Debug */ = { 352 | isa = XCBuildConfiguration; 353 | buildSettings = { 354 | BUNDLE_LOADER = "$(TEST_HOST)"; 355 | FRAMEWORK_SEARCH_PATHS = ( 356 | "$(SDKROOT)/Developer/Library/Frameworks", 357 | "$(inherited)", 358 | ); 359 | GCC_PREPROCESSOR_DEFINITIONS = ( 360 | "DEBUG=1", 361 | "$(inherited)", 362 | ); 363 | INFOPLIST_FILE = TodoListTests/Info.plist; 364 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 365 | PRODUCT_NAME = "$(TARGET_NAME)"; 366 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TodoList.app/TodoList"; 367 | }; 368 | name = Debug; 369 | }; 370 | 141DEE8219A385B6009C0CD9 /* Release */ = { 371 | isa = XCBuildConfiguration; 372 | buildSettings = { 373 | BUNDLE_LOADER = "$(TEST_HOST)"; 374 | FRAMEWORK_SEARCH_PATHS = ( 375 | "$(SDKROOT)/Developer/Library/Frameworks", 376 | "$(inherited)", 377 | ); 378 | INFOPLIST_FILE = TodoListTests/Info.plist; 379 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 380 | PRODUCT_NAME = "$(TARGET_NAME)"; 381 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/TodoList.app/TodoList"; 382 | }; 383 | name = Release; 384 | }; 385 | /* End XCBuildConfiguration section */ 386 | 387 | /* Begin XCConfigurationList section */ 388 | 141DEE5C19A385B5009C0CD9 /* Build configuration list for PBXProject "TodoList" */ = { 389 | isa = XCConfigurationList; 390 | buildConfigurations = ( 391 | 141DEE7B19A385B6009C0CD9 /* Debug */, 392 | 141DEE7C19A385B6009C0CD9 /* Release */, 393 | ); 394 | defaultConfigurationIsVisible = 0; 395 | defaultConfigurationName = Release; 396 | }; 397 | 141DEE7D19A385B6009C0CD9 /* Build configuration list for PBXNativeTarget "TodoList" */ = { 398 | isa = XCConfigurationList; 399 | buildConfigurations = ( 400 | 141DEE7E19A385B6009C0CD9 /* Debug */, 401 | 141DEE7F19A385B6009C0CD9 /* Release */, 402 | ); 403 | defaultConfigurationIsVisible = 0; 404 | defaultConfigurationName = Release; 405 | }; 406 | 141DEE8019A385B6009C0CD9 /* Build configuration list for PBXNativeTarget "TodoListTests" */ = { 407 | isa = XCConfigurationList; 408 | buildConfigurations = ( 409 | 141DEE8119A385B6009C0CD9 /* Debug */, 410 | 141DEE8219A385B6009C0CD9 /* Release */, 411 | ); 412 | defaultConfigurationIsVisible = 0; 413 | defaultConfigurationName = Release; 414 | }; 415 | /* End XCConfigurationList section */ 416 | }; 417 | rootObject = 141DEE5919A385B5009C0CD9 /* Project object */; 418 | } 419 | --------------------------------------------------------------------------------