├── .github └── FUNDING.yml ├── README.md ├── resources └── example.gif ├── TodoExample ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Sources │ ├── ContentView.swift │ ├── Task.swift │ ├── TaskColor.swift │ ├── AppDelegate.swift │ ├── SceneDelegate.swift │ ├── TaskListView.swift │ ├── TaskData.swift │ ├── TaskListRow.swift │ └── CreateTaskView.swift ├── Base.lproj │ └── LaunchScreen.storyboard └── Info.plist ├── .gitignore └── TodoExample.xcodeproj └── project.pbxproj /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: sgr-ksmt 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SwiftUI-Todo 2 | 3 | Todo application using SwiftUI 4 | 5 | ![](resources/example.gif) -------------------------------------------------------------------------------- /resources/example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sgr-ksmt/SwiftUI-Todo/HEAD/resources/example.gif -------------------------------------------------------------------------------- /TodoExample/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /TodoExample/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /TodoExample/Sources/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ContentView : View { 12 | var body: some View { 13 | TaskListView() 14 | } 15 | } 16 | 17 | #if DEBUG 18 | struct ContentView_Previews : PreviewProvider { 19 | static var previews: some View { 20 | ContentView() 21 | } 22 | } 23 | #endif 24 | -------------------------------------------------------------------------------- /TodoExample/Sources/Task.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Task.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | 12 | struct Task: Equatable, Hashable { 13 | var id: String = UUID().uuidString 14 | var text: String 15 | var color: TaskColor 16 | var isDone: Bool = false 17 | 18 | static func mock() -> Task { 19 | .init(text: randomTaskText.randomElement()!, color: TaskColor.random) 20 | } 21 | } 22 | 23 | private let randomTaskText: [String] = [ 24 | "Buy MacBook Pro", 25 | "Go Office", 26 | "Send E-mail to Bob", 27 | "Redesign website", 28 | "Buy iPhone X", 29 | ] 30 | -------------------------------------------------------------------------------- /TodoExample/Sources/TaskColor.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskColor.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | enum TaskColor: CaseIterable { 12 | case red 13 | case green 14 | case blue 15 | case yellow 16 | 17 | var color: Color { 18 | switch self { 19 | case .red: return .red 20 | case .green: return .green 21 | case .blue: return .blue 22 | case .yellow: return .yellow 23 | } 24 | } 25 | 26 | static var `default`: TaskColor { 27 | return .red 28 | } 29 | 30 | static var random: TaskColor { 31 | return TaskColor.allCases.randomElement()! 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /TodoExample/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 14 | return true 15 | } 16 | 17 | func applicationWillTerminate(_ application: UIApplication) { 18 | } 19 | 20 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 21 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 22 | } 23 | 24 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { 25 | } 26 | 27 | } 28 | 29 | -------------------------------------------------------------------------------- /TodoExample/Sources/SceneDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneDelegate.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SwiftUI 11 | 12 | class SceneDelegate: UIResponder, UIWindowSceneDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 18 | let window = UIWindow(frame: UIScreen.main.bounds) 19 | window.rootViewController = UIHostingController(rootView: ContentView().environmentObject(TaskData.mock())) 20 | self.window = window 21 | window.makeKeyAndVisible() 22 | } 23 | 24 | func sceneDidDisconnect(_ scene: UIScene) { 25 | } 26 | 27 | func sceneDidBecomeActive(_ scene: UIScene) { 28 | } 29 | 30 | func sceneWillResignActive(_ scene: UIScene) { 31 | } 32 | 33 | func sceneWillEnterForeground(_ scene: UIScene) { 34 | } 35 | 36 | func sceneDidEnterBackground(_ scene: UIScene) { 37 | } 38 | } 39 | 40 | -------------------------------------------------------------------------------- /TodoExample/Sources/TaskListView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskListView.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct TaskListView : View { 12 | @EnvironmentObject private var taskData: TaskData 13 | var body: some View { 14 | NavigationView { 15 | Group { 16 | CreateTaskView() 17 | 18 | Toggle(isOn: $taskData.hideDoneTasks) { 19 | Text("Hide done tasks") 20 | } 21 | .padding(.horizontal) 22 | 23 | List { 24 | ForEach(taskData.tasks.identified(by: \.self)) { task in 25 | if !self.taskData.hideDoneTasks || !task.isDone { 26 | TaskListRow(task: task) 27 | } 28 | } 29 | } 30 | } 31 | .navigationBarTitle(Text("Todo List")) 32 | } 33 | } 34 | } 35 | 36 | #if DEBUG 37 | struct TaskListView_Previews : PreviewProvider { 38 | static var previews: some View { 39 | TaskListView() 40 | } 41 | } 42 | #endif 43 | -------------------------------------------------------------------------------- /TodoExample/Sources/TaskData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskData.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import Combine 10 | import SwiftUI 11 | 12 | final class TaskData: BindableObject { 13 | let didChange = PassthroughSubject() 14 | 15 | var tasks: [Task] = [] { 16 | didSet { 17 | didChange.send(self) 18 | } 19 | } 20 | 21 | var hideDoneTasks: Bool = true { 22 | didSet { 23 | didChange.send(self) 24 | } 25 | } 26 | 27 | func index(of task: Task) -> Int { 28 | tasks.firstIndex { $0.id == task.id }! 29 | } 30 | 31 | func create(text: String, color: TaskColor) { 32 | tasks.append(Task(text: text, color: color)) 33 | } 34 | 35 | func toggleDone(_ task: Task) { 36 | tasks[index(of: task)].isDone.toggle() 37 | } 38 | 39 | func delete(_ task: Task) { 40 | tasks.remove(at: index(of: task)) 41 | } 42 | 43 | static func mock(size: Int = 3) -> TaskData { 44 | let data = TaskData() 45 | data.tasks = (0.. 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 | -------------------------------------------------------------------------------- /TodoExample/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /TodoExample/Sources/TaskListRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TaskListRow.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct TaskListRow : View { 12 | @EnvironmentObject private var taskData: TaskData 13 | @State private var alertIsShown: Bool = false 14 | var task: Task 15 | 16 | var body: some View { 17 | HStack(alignment: .center, spacing: 16.0) { 18 | if self.task.isDone { 19 | Image(systemName: "checkmark.square.fill").imageScale(.large) 20 | .tapAction(count: 1) { 21 | self.taskData.toggleDone(self.task) 22 | } 23 | } else { 24 | Image(systemName: "checkmark.square").imageScale(.large) 25 | .tapAction(count: 1) { 26 | self.taskData.toggleDone(self.task) 27 | } 28 | } 29 | 30 | Text(task.text).font(.title) 31 | 32 | Spacer() 33 | 34 | Image(systemName: "trash.fill").imageScale(.large) 35 | .disabled(false) 36 | .tapAction { self.alertIsShown = true } 37 | .presentation($alertIsShown) { 38 | Alert( 39 | title: Text("Confirm"), 40 | message: Text("Delete this Task?\ntext: \(self.task.text)"), 41 | primaryButton: .destructive(Text("Delete")) { 42 | self.taskData.delete(self.task) 43 | }, 44 | secondaryButton: .cancel() 45 | ) 46 | } 47 | } 48 | .padding() 49 | .background(task.color.color.opacity(0.8)) 50 | .cornerRadius(8.0) 51 | } 52 | } 53 | 54 | #if DEBUG 55 | struct TaskListRow_Previews : PreviewProvider { 56 | static var previews: some View { 57 | TaskListRow(task: .mock()) 58 | } 59 | } 60 | #endif 61 | -------------------------------------------------------------------------------- /TodoExample/Sources/CreateTaskView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CreateTaskView.swift 3 | // TodoExample 4 | // 5 | // Created by suguru-kishimoto on 2019/06/05. 6 | // Copyright © 2019 suguru-kishimoto. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct CreateTaskView : View { 12 | @EnvironmentObject private var taskData: TaskData 13 | @State private var draftText: String = "" 14 | @State private var selectedColor: TaskColor = TaskColor.default 15 | var body: some View { 16 | VStack { 17 | VStack(alignment: .leading, spacing: 16.0) { 18 | HStack { 19 | TextField($draftText, placeholder: Text("Create a new task...")) 20 | .frame(height: 40) 21 | .padding(.horizontal, 8) 22 | .border(Color.gray, cornerRadius: 8) 23 | Image(systemName: "plus.circle").imageScale(.large) 24 | .tapAction { 25 | guard !self.draftText.isEmpty else { 26 | return 27 | } 28 | self.taskData.create(text: self.draftText, color: self.selectedColor) 29 | self.clear() 30 | } 31 | } 32 | 33 | HStack { 34 | ForEach(TaskColor.allCases.identified(by: \.self)) { c in 35 | Image(systemName: c == self.selectedColor ? "circle.fill" : "circle") 36 | .foregroundColor(c.color) 37 | .tapAction { self.selectedColor = c } 38 | } 39 | } 40 | } 41 | } 42 | .padding() 43 | .background(Color.gray.opacity(0.3), cornerRadius: 8.0) 44 | .padding(.horizontal) 45 | } 46 | 47 | private func clear() { 48 | draftText = "" 49 | selectedColor = TaskColor.default 50 | } 51 | } 52 | 53 | #if DEBUG 54 | struct CreateTaskView_Previews : PreviewProvider { 55 | static var previews: some View { 56 | CreateTaskView() 57 | } 58 | } 59 | #endif 60 | -------------------------------------------------------------------------------- /TodoExample/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UIApplicationSceneManifest 24 | 25 | UIApplicationSupportsMultipleScenes 26 | 27 | UISceneConfigurations 28 | 29 | UIWindowSceneSessionRoleApplication 30 | 31 | 32 | UILaunchStoryboardName 33 | LaunchScreen 34 | UISceneConfigurationName 35 | Default Configuration 36 | UISceneDelegateClassName 37 | $(PRODUCT_MODULE_NAME).SceneDelegate 38 | 39 | 40 | 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UISupportedInterfaceOrientations~ipad 55 | 56 | UIInterfaceOrientationPortrait 57 | UIInterfaceOrientationPortraitUpsideDown 58 | UIInterfaceOrientationLandscapeLeft 59 | UIInterfaceOrientationLandscapeRight 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/f9291de89f5f7dc0d3d87f9eb111b839f81d5dbc/Swift.gitignore 2 | 3 | # Xcode 4 | # 5 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 6 | 7 | ## Build generated 8 | build/ 9 | DerivedData/ 10 | 11 | ## Various settings 12 | *.pbxuser 13 | !default.pbxuser 14 | *.mode1v3 15 | !default.mode1v3 16 | *.mode2v3 17 | !default.mode2v3 18 | *.perspectivev3 19 | !default.perspectivev3 20 | xcuserdata/ 21 | 22 | ## Other 23 | *.moved-aside 24 | *.xccheckout 25 | *.xcscmblueprint 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | *.dSYM.zip 31 | *.dSYM 32 | 33 | ## Playgrounds 34 | timeline.xctimeline 35 | playground.xcworkspace 36 | 37 | # Swift Package Manager 38 | # 39 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 40 | # Packages/ 41 | # Package.pins 42 | # Package.resolved 43 | .build/ 44 | 45 | # CocoaPods 46 | # 47 | # We recommend against adding the Pods directory to your .gitignore. However 48 | # you should judge for yourself, the pros and cons are mentioned at: 49 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 50 | # 51 | # Pods/ 52 | # 53 | # Add this line if you want to avoid checking in source code from the Xcode workspace 54 | # *.xcworkspace 55 | 56 | # Carthage 57 | # 58 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 59 | # Carthage/Checkouts 60 | 61 | Carthage/Build 62 | 63 | # Accio dependency management 64 | Dependencies/ 65 | .accio/ 66 | 67 | # fastlane 68 | # 69 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 70 | # screenshots whenever they are needed. 71 | # For more information about the recommended setup visit: 72 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 73 | 74 | fastlane/report.xml 75 | fastlane/Preview.html 76 | fastlane/screenshots/**/*.png 77 | fastlane/test_output 78 | 79 | # Code Injection 80 | # 81 | # After new code Injection tools there's a generated folder /iOSInjectionProject 82 | # https://github.com/johnno1962/injectionforxcode 83 | 84 | iOSInjectionProject/ 85 | 86 | 87 | ### https://raw.github.com/github/gitignore/f9291de89f5f7dc0d3d87f9eb111b839f81d5dbc/Global/Xcode.gitignore 88 | 89 | # Xcode 90 | # 91 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 92 | 93 | ## User settings 94 | xcuserdata/ 95 | 96 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 97 | *.xcscmblueprint 98 | *.xccheckout 99 | 100 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 101 | build/ 102 | DerivedData/ 103 | *.moved-aside 104 | *.pbxuser 105 | !default.pbxuser 106 | *.mode1v3 107 | !default.mode1v3 108 | *.mode2v3 109 | !default.mode2v3 110 | *.perspectivev3 111 | !default.perspectivev3 112 | 113 | ## Xcode Patch 114 | *.xcodeproj/* 115 | !*.xcodeproj/project.pbxproj 116 | !*.xcodeproj/xcshareddata/ 117 | !*.xcworkspace/contents.xcworkspacedata 118 | /*.gcno 119 | 120 | 121 | -------------------------------------------------------------------------------- /TodoExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 160002E922A7D4C000C997C1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 160002E822A7D4C000C997C1 /* AppDelegate.swift */; }; 11 | 160002EB22A7D4C000C997C1 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 160002EA22A7D4C000C997C1 /* SceneDelegate.swift */; }; 12 | 160002ED22A7D4C000C997C1 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 160002EC22A7D4C000C997C1 /* ContentView.swift */; }; 13 | 160002EF22A7D4C100C997C1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 160002EE22A7D4C100C997C1 /* Assets.xcassets */; }; 14 | 160002F222A7D4C100C997C1 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 160002F122A7D4C100C997C1 /* Preview Assets.xcassets */; }; 15 | 160002F522A7D4C100C997C1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 160002F322A7D4C100C997C1 /* LaunchScreen.storyboard */; }; 16 | 16A234BA22A7D745005F9B8F /* TaskData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A234B922A7D745005F9B8F /* TaskData.swift */; }; 17 | 16A234BC22A7D7D8005F9B8F /* Task.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A234BB22A7D7D8005F9B8F /* Task.swift */; }; 18 | 16A234C022A7D9A8005F9B8F /* TaskListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A234BF22A7D9A8005F9B8F /* TaskListView.swift */; }; 19 | 16A234C222A7DAB7005F9B8F /* TaskListRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16A234C122A7DAB7005F9B8F /* TaskListRow.swift */; }; 20 | 16C2206C22A7FE2B00B77D9F /* CreateTaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C2206B22A7FE2B00B77D9F /* CreateTaskView.swift */; }; 21 | 16C2206E22A802AD00B77D9F /* TaskColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16C2206D22A802AD00B77D9F /* TaskColor.swift */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXFileReference section */ 25 | 160002E522A7D4C000C997C1 /* TodoExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TodoExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 160002E822A7D4C000C997C1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 27 | 160002EA22A7D4C000C997C1 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; 28 | 160002EC22A7D4C000C997C1 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 29 | 160002EE22A7D4C100C997C1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 30 | 160002F122A7D4C100C997C1 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 31 | 160002F422A7D4C100C997C1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 32 | 160002F622A7D4C100C997C1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 16A234B922A7D745005F9B8F /* TaskData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskData.swift; sourceTree = ""; }; 34 | 16A234BB22A7D7D8005F9B8F /* Task.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Task.swift; sourceTree = ""; }; 35 | 16A234BF22A7D9A8005F9B8F /* TaskListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListView.swift; sourceTree = ""; }; 36 | 16A234C122A7DAB7005F9B8F /* TaskListRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskListRow.swift; sourceTree = ""; }; 37 | 16C2206B22A7FE2B00B77D9F /* CreateTaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateTaskView.swift; sourceTree = ""; }; 38 | 16C2206D22A802AD00B77D9F /* TaskColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaskColor.swift; sourceTree = ""; }; 39 | /* End PBXFileReference section */ 40 | 41 | /* Begin PBXFrameworksBuildPhase section */ 42 | 160002E222A7D4C000C997C1 /* Frameworks */ = { 43 | isa = PBXFrameworksBuildPhase; 44 | buildActionMask = 2147483647; 45 | files = ( 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXFrameworksBuildPhase section */ 50 | 51 | /* Begin PBXGroup section */ 52 | 160002DC22A7D4C000C997C1 = { 53 | isa = PBXGroup; 54 | children = ( 55 | 160002E722A7D4C000C997C1 /* TodoExample */, 56 | 160002E622A7D4C000C997C1 /* Products */, 57 | ); 58 | sourceTree = ""; 59 | }; 60 | 160002E622A7D4C000C997C1 /* Products */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | 160002E522A7D4C000C997C1 /* TodoExample.app */, 64 | ); 65 | name = Products; 66 | sourceTree = ""; 67 | }; 68 | 160002E722A7D4C000C997C1 /* TodoExample */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 160002FC22A7D4E200C997C1 /* Sources */, 72 | 160002EE22A7D4C100C997C1 /* Assets.xcassets */, 73 | 160002F322A7D4C100C997C1 /* LaunchScreen.storyboard */, 74 | 160002F622A7D4C100C997C1 /* Info.plist */, 75 | 160002F022A7D4C100C997C1 /* Preview Content */, 76 | ); 77 | path = TodoExample; 78 | sourceTree = ""; 79 | }; 80 | 160002F022A7D4C100C997C1 /* Preview Content */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 160002F122A7D4C100C997C1 /* Preview Assets.xcassets */, 84 | ); 85 | path = "Preview Content"; 86 | sourceTree = ""; 87 | }; 88 | 160002FC22A7D4E200C997C1 /* Sources */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 160002E822A7D4C000C997C1 /* AppDelegate.swift */, 92 | 160002EA22A7D4C000C997C1 /* SceneDelegate.swift */, 93 | 160002EC22A7D4C000C997C1 /* ContentView.swift */, 94 | 16A234B922A7D745005F9B8F /* TaskData.swift */, 95 | 16A234BB22A7D7D8005F9B8F /* Task.swift */, 96 | 16C2206D22A802AD00B77D9F /* TaskColor.swift */, 97 | 16A234BF22A7D9A8005F9B8F /* TaskListView.swift */, 98 | 16A234C122A7DAB7005F9B8F /* TaskListRow.swift */, 99 | 16C2206B22A7FE2B00B77D9F /* CreateTaskView.swift */, 100 | ); 101 | path = Sources; 102 | sourceTree = ""; 103 | }; 104 | /* End PBXGroup section */ 105 | 106 | /* Begin PBXNativeTarget section */ 107 | 160002E422A7D4C000C997C1 /* TodoExample */ = { 108 | isa = PBXNativeTarget; 109 | buildConfigurationList = 160002F922A7D4C100C997C1 /* Build configuration list for PBXNativeTarget "TodoExample" */; 110 | buildPhases = ( 111 | 160002E122A7D4C000C997C1 /* Sources */, 112 | 160002E222A7D4C000C997C1 /* Frameworks */, 113 | 160002E322A7D4C000C997C1 /* Resources */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = TodoExample; 120 | productName = TodoExample; 121 | productReference = 160002E522A7D4C000C997C1 /* TodoExample.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 160002DD22A7D4C000C997C1 /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastSwiftUpdateCheck = 1100; 131 | LastUpgradeCheck = 1100; 132 | ORGANIZATIONNAME = "suguru-kishimoto"; 133 | TargetAttributes = { 134 | 160002E422A7D4C000C997C1 = { 135 | CreatedOnToolsVersion = 11.0; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 160002E022A7D4C000C997C1 /* Build configuration list for PBXProject "TodoExample" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 160002DC22A7D4C000C997C1; 148 | productRefGroup = 160002E622A7D4C000C997C1 /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 160002E422A7D4C000C997C1 /* TodoExample */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 160002E322A7D4C000C997C1 /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 160002F522A7D4C100C997C1 /* LaunchScreen.storyboard in Resources */, 163 | 160002F222A7D4C100C997C1 /* Preview Assets.xcassets in Resources */, 164 | 160002EF22A7D4C100C997C1 /* Assets.xcassets in Resources */, 165 | ); 166 | runOnlyForDeploymentPostprocessing = 0; 167 | }; 168 | /* End PBXResourcesBuildPhase section */ 169 | 170 | /* Begin PBXSourcesBuildPhase section */ 171 | 160002E122A7D4C000C997C1 /* Sources */ = { 172 | isa = PBXSourcesBuildPhase; 173 | buildActionMask = 2147483647; 174 | files = ( 175 | 160002E922A7D4C000C997C1 /* AppDelegate.swift in Sources */, 176 | 16C2206C22A7FE2B00B77D9F /* CreateTaskView.swift in Sources */, 177 | 160002EB22A7D4C000C997C1 /* SceneDelegate.swift in Sources */, 178 | 16A234BC22A7D7D8005F9B8F /* Task.swift in Sources */, 179 | 16A234C222A7DAB7005F9B8F /* TaskListRow.swift in Sources */, 180 | 16C2206E22A802AD00B77D9F /* TaskColor.swift in Sources */, 181 | 16A234BA22A7D745005F9B8F /* TaskData.swift in Sources */, 182 | 160002ED22A7D4C000C997C1 /* ContentView.swift in Sources */, 183 | 16A234C022A7D9A8005F9B8F /* TaskListView.swift in Sources */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXSourcesBuildPhase section */ 188 | 189 | /* Begin PBXVariantGroup section */ 190 | 160002F322A7D4C100C997C1 /* LaunchScreen.storyboard */ = { 191 | isa = PBXVariantGroup; 192 | children = ( 193 | 160002F422A7D4C100C997C1 /* Base */, 194 | ); 195 | name = LaunchScreen.storyboard; 196 | sourceTree = ""; 197 | }; 198 | /* End PBXVariantGroup section */ 199 | 200 | /* Begin XCBuildConfiguration section */ 201 | 160002F722A7D4C100C997C1 /* Debug */ = { 202 | isa = XCBuildConfiguration; 203 | buildSettings = { 204 | ALWAYS_SEARCH_USER_PATHS = NO; 205 | CLANG_ANALYZER_NONNULL = YES; 206 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 207 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 208 | CLANG_CXX_LIBRARY = "libc++"; 209 | CLANG_ENABLE_MODULES = YES; 210 | CLANG_ENABLE_OBJC_ARC = YES; 211 | CLANG_ENABLE_OBJC_WEAK = YES; 212 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 213 | CLANG_WARN_BOOL_CONVERSION = YES; 214 | CLANG_WARN_COMMA = YES; 215 | CLANG_WARN_CONSTANT_CONVERSION = YES; 216 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 217 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 218 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 219 | CLANG_WARN_EMPTY_BODY = YES; 220 | CLANG_WARN_ENUM_CONVERSION = YES; 221 | CLANG_WARN_INFINITE_RECURSION = YES; 222 | CLANG_WARN_INT_CONVERSION = YES; 223 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 224 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 225 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 226 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 227 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 228 | CLANG_WARN_STRICT_PROTOTYPES = YES; 229 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 230 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 231 | CLANG_WARN_UNREACHABLE_CODE = YES; 232 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 233 | COPY_PHASE_STRIP = NO; 234 | DEBUG_INFORMATION_FORMAT = dwarf; 235 | ENABLE_STRICT_OBJC_MSGSEND = YES; 236 | ENABLE_TESTABILITY = YES; 237 | GCC_C_LANGUAGE_STANDARD = gnu11; 238 | GCC_DYNAMIC_NO_PIC = NO; 239 | GCC_NO_COMMON_BLOCKS = YES; 240 | GCC_OPTIMIZATION_LEVEL = 0; 241 | GCC_PREPROCESSOR_DEFINITIONS = ( 242 | "DEBUG=1", 243 | "$(inherited)", 244 | ); 245 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 246 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 247 | GCC_WARN_UNDECLARED_SELECTOR = YES; 248 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 249 | GCC_WARN_UNUSED_FUNCTION = YES; 250 | GCC_WARN_UNUSED_VARIABLE = YES; 251 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 252 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 253 | MTL_FAST_MATH = YES; 254 | ONLY_ACTIVE_ARCH = YES; 255 | SDKROOT = iphoneos; 256 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 257 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 258 | }; 259 | name = Debug; 260 | }; 261 | 160002F822A7D4C100C997C1 /* Release */ = { 262 | isa = XCBuildConfiguration; 263 | buildSettings = { 264 | ALWAYS_SEARCH_USER_PATHS = NO; 265 | CLANG_ANALYZER_NONNULL = YES; 266 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 267 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 268 | CLANG_CXX_LIBRARY = "libc++"; 269 | CLANG_ENABLE_MODULES = YES; 270 | CLANG_ENABLE_OBJC_ARC = YES; 271 | CLANG_ENABLE_OBJC_WEAK = YES; 272 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 273 | CLANG_WARN_BOOL_CONVERSION = YES; 274 | CLANG_WARN_COMMA = YES; 275 | CLANG_WARN_CONSTANT_CONVERSION = YES; 276 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 277 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 278 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 279 | CLANG_WARN_EMPTY_BODY = YES; 280 | CLANG_WARN_ENUM_CONVERSION = YES; 281 | CLANG_WARN_INFINITE_RECURSION = YES; 282 | CLANG_WARN_INT_CONVERSION = YES; 283 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 284 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 285 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 286 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 287 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 288 | CLANG_WARN_STRICT_PROTOTYPES = YES; 289 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 290 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 291 | CLANG_WARN_UNREACHABLE_CODE = YES; 292 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 293 | COPY_PHASE_STRIP = NO; 294 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 295 | ENABLE_NS_ASSERTIONS = NO; 296 | ENABLE_STRICT_OBJC_MSGSEND = YES; 297 | GCC_C_LANGUAGE_STANDARD = gnu11; 298 | GCC_NO_COMMON_BLOCKS = YES; 299 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 300 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 301 | GCC_WARN_UNDECLARED_SELECTOR = YES; 302 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 303 | GCC_WARN_UNUSED_FUNCTION = YES; 304 | GCC_WARN_UNUSED_VARIABLE = YES; 305 | IPHONEOS_DEPLOYMENT_TARGET = 13.0; 306 | MTL_ENABLE_DEBUG_INFO = NO; 307 | MTL_FAST_MATH = YES; 308 | SDKROOT = iphoneos; 309 | SWIFT_COMPILATION_MODE = wholemodule; 310 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 311 | VALIDATE_PRODUCT = YES; 312 | }; 313 | name = Release; 314 | }; 315 | 160002FA22A7D4C100C997C1 /* Debug */ = { 316 | isa = XCBuildConfiguration; 317 | buildSettings = { 318 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 319 | CODE_SIGN_STYLE = Automatic; 320 | DEVELOPMENT_ASSET_PATHS = "TodoExample/Preview\\ Content"; 321 | ENABLE_PREVIEWS = YES; 322 | INFOPLIST_FILE = TodoExample/Info.plist; 323 | LD_RUNPATH_SEARCH_PATHS = ( 324 | "$(inherited)", 325 | "@executable_path/Frameworks", 326 | ); 327 | PRODUCT_BUNDLE_IDENTIFIER = "-.TodoExample"; 328 | PRODUCT_NAME = "$(TARGET_NAME)"; 329 | SWIFT_VERSION = 5.0; 330 | TARGETED_DEVICE_FAMILY = "1,2"; 331 | }; 332 | name = Debug; 333 | }; 334 | 160002FB22A7D4C100C997C1 /* Release */ = { 335 | isa = XCBuildConfiguration; 336 | buildSettings = { 337 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 338 | CODE_SIGN_STYLE = Automatic; 339 | DEVELOPMENT_ASSET_PATHS = "TodoExample/Preview\\ Content"; 340 | ENABLE_PREVIEWS = YES; 341 | INFOPLIST_FILE = TodoExample/Info.plist; 342 | LD_RUNPATH_SEARCH_PATHS = ( 343 | "$(inherited)", 344 | "@executable_path/Frameworks", 345 | ); 346 | PRODUCT_BUNDLE_IDENTIFIER = "-.TodoExample"; 347 | PRODUCT_NAME = "$(TARGET_NAME)"; 348 | SWIFT_VERSION = 5.0; 349 | TARGETED_DEVICE_FAMILY = "1,2"; 350 | }; 351 | name = Release; 352 | }; 353 | /* End XCBuildConfiguration section */ 354 | 355 | /* Begin XCConfigurationList section */ 356 | 160002E022A7D4C000C997C1 /* Build configuration list for PBXProject "TodoExample" */ = { 357 | isa = XCConfigurationList; 358 | buildConfigurations = ( 359 | 160002F722A7D4C100C997C1 /* Debug */, 360 | 160002F822A7D4C100C997C1 /* Release */, 361 | ); 362 | defaultConfigurationIsVisible = 0; 363 | defaultConfigurationName = Release; 364 | }; 365 | 160002F922A7D4C100C997C1 /* Build configuration list for PBXNativeTarget "TodoExample" */ = { 366 | isa = XCConfigurationList; 367 | buildConfigurations = ( 368 | 160002FA22A7D4C100C997C1 /* Debug */, 369 | 160002FB22A7D4C100C997C1 /* Release */, 370 | ); 371 | defaultConfigurationIsVisible = 0; 372 | defaultConfigurationName = Release; 373 | }; 374 | /* End XCConfigurationList section */ 375 | }; 376 | rootObject = 160002DD22A7D4C000C997C1 /* Project object */; 377 | } 378 | --------------------------------------------------------------------------------