├── DemoToDoList
├── DemoToDoList
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── Model
│ │ └── Todo.swift
│ ├── ContentView.swift
│ ├── New Todo
│ │ ├── NewTodoViewModel.swift
│ │ └── NewTodoView.swift
│ ├── Todo List
│ │ ├── TodoRow.swift
│ │ ├── TodoListViewModel.swift
│ │ └── TodoListView.swift
│ ├── Managers
│ │ └── DataManager.swift
│ ├── Mock
│ │ └── MockDataManager.swift
│ ├── AppDelegate.swift
│ ├── Base.lproj
│ │ └── LaunchScreen.storyboard
│ ├── Helpers
│ │ └── KeyboardResponder.swift
│ ├── Info.plist
│ └── SceneDelegate.swift
├── DemoToDoList.xcodeproj
│ ├── project.xcworkspace
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata
│ │ │ └── IDEWorkspaceChecks.plist
│ └── project.pbxproj
├── DemoToDoList.xcworkspace
│ ├── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ └── contents.xcworkspacedata
└── Modules
│ └── DBHelper
│ ├── DBHelper
│ ├── DBHelper.h
│ ├── Info.plist
│ └── Sources
│ │ └── DBHelper.swift
│ └── DBHelper.xcodeproj
│ └── project.pbxproj
└── .gitignore
/DemoToDoList/DemoToDoList/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Model/Todo.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Todo.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-29.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | struct Todo: Identifiable {
12 | var id = UUID()
13 | var title: String
14 | var isCompleted = false
15 | }
16 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/ContentView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ContentView.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-29.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct ContentView: View {
12 | var body: some View {
13 | Text("Hello, SwiftUI!")
14 | .font(.title)
15 | .foregroundColor(.green)
16 | }
17 | }
18 |
19 | struct ContentView_Previews: PreviewProvider {
20 | static var previews: some View {
21 | ContentView()
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/DemoToDoList/Modules/DBHelper/DBHelper/DBHelper.h:
--------------------------------------------------------------------------------
1 | //
2 | // DBHelper.h
3 | // DBHelper
4 | //
5 | // Created by Alex Zarr on 2020-02-24.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | //! Project version number for DBHelper.
12 | FOUNDATION_EXPORT double DBHelperVersionNumber;
13 |
14 | //! Project version string for DBHelper.
15 | FOUNDATION_EXPORT const unsigned char DBHelperVersionString[];
16 |
17 | // In this header, you should import all the public headers of your framework using statements like #import
18 |
19 |
20 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/New Todo/NewTodoViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NewTodoViewModel.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-02-04.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | protocol NewTodoViewModelProtocol {
13 | func addNewTodo(title: String)
14 | }
15 |
16 | final class NewTodoViewModel: ObservableObject {
17 | var dataManager: DataManagerProtocol
18 |
19 | init(dataManager: DataManagerProtocol = DataManager.shared) {
20 | self.dataManager = dataManager
21 | }
22 | }
23 |
24 | // MARK: - NewTodoViewModelProtocol
25 | extension NewTodoViewModel: NewTodoViewModelProtocol {
26 | func addNewTodo(title: String) {
27 | dataManager.addTodo(title: title)
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/DemoToDoList/Modules/DBHelper/DBHelper/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 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/DemoToDoList/Modules/DBHelper/DBHelper/Sources/DBHelper.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DBHelper.swift
3 | // DBHelper
4 | //
5 | // Created by Alex Zarr on 2020-02-24.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol DBHelperProtocol {
12 | associatedtype ObjectType
13 | associatedtype PredicateType
14 |
15 | func create(_ object: ObjectType)
16 | func fetchFirst(_ objectType: ObjectType.Type, predicate: PredicateType?) -> Result
17 | func fetch(_ objectType: ObjectType.Type, predicate: PredicateType?, limit: Int?) -> Result<[ObjectType], Error>
18 | func update(_ object: ObjectType)
19 | func delete(_ object: ObjectType)
20 | }
21 |
22 | public extension DBHelperProtocol {
23 | func fetch(_ objectType: ObjectType.Type, predicate: PredicateType? = nil, limit: Int? = nil) -> Result<[ObjectType], Error> {
24 | return fetch(objectType, predicate: predicate, limit: limit)
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Todo List/TodoRow.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TodoRow.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-02-12.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct TodoRow: View {
12 | var todo: Todo
13 |
14 | var body: some View {
15 | HStack { // 1
16 | Image(systemName: todo.isCompleted ? "checkmark.square.fill" : "square") // 2
17 | .resizable() // 3
18 | .frame(width: 20, height: 20) // 4
19 | .foregroundColor(todo.isCompleted ? .blue : .black) // 5
20 | Text(todo.title)
21 | Spacer() // 6
22 | }
23 | }
24 | }
25 |
26 | struct TodoRow_Previews: PreviewProvider {
27 | static var previews: some View {
28 | Group { // 7
29 | TodoRow(todo: Todo(title: "Buy groceries"))
30 | TodoRow(todo: Todo(title: "Visit a doctor", isCompleted: true)) // 8
31 | }
32 | .previewLayout(.fixed(width: 300, height: 44)) // 9
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Todo List/TodoListViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TodoListViewModel.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-31.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import Combine
11 |
12 | protocol TodoListViewModelProtocol {
13 | var todos: [Todo] { get }
14 | var showCompleted: Bool { get set }
15 | func fetchTodos()
16 | // func addTodo(title: String)
17 | func toggleIsCompleted(for todo: Todo)
18 | }
19 |
20 | final class TodoListViewModel: ObservableObject {
21 | @Published var todos = [Todo]()
22 | @Published var showCompleted = false {
23 | didSet {
24 | fetchTodos()
25 | }
26 | }
27 |
28 | var dataManager: DataManagerProtocol
29 |
30 | init(dataManager: DataManagerProtocol = DataManager.shared) {
31 | self.dataManager = dataManager
32 | fetchTodos()
33 | }
34 | }
35 |
36 | // MARK: - TodoListViewModelProtocol
37 | extension TodoListViewModel: TodoListViewModelProtocol {
38 | func fetchTodos() {
39 | todos = dataManager.fetchTodoList(includingCompleted: showCompleted)
40 | }
41 |
42 | func toggleIsCompleted(for todo: Todo) {
43 | dataManager.toggleIsCompleted(for: todo)
44 | fetchTodos()
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Managers/DataManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DataManager.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-29.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | protocol DataManagerProtocol {
12 | func fetchTodoList(includingCompleted: Bool) -> [Todo]
13 | func addTodo(title: String)
14 | func toggleIsCompleted(for todo: Todo)
15 | }
16 |
17 | extension DataManagerProtocol {
18 | func fetchTodoList(includingCompleted: Bool = false) -> [Todo] {
19 | fetchTodoList(includingCompleted: includingCompleted)
20 | }
21 | }
22 |
23 | class DataManager {
24 | static let shared: DataManagerProtocol = DataManager()
25 |
26 | private var todos = [Todo]()
27 |
28 | private init() { }
29 | }
30 |
31 | // MARK: - DataManagerProtocol
32 | extension DataManager: DataManagerProtocol {
33 | func fetchTodoList(includingCompleted: Bool = false) -> [Todo] {
34 | includingCompleted ? todos : todos.filter { !$0.isCompleted }
35 | }
36 |
37 | func addTodo(title: String) {
38 | let todo = Todo(title: title)
39 | todos.insert(todo, at: 0)
40 | }
41 |
42 | func toggleIsCompleted(for todo: Todo) {
43 | if let index = todos.firstIndex(where: { $0.id == todo.id }) {
44 | todos[index].isCompleted.toggle()
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Mock/MockDataManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MockDataManager.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-31.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | class MockDataManager {
12 | private var todos = [Todo]()
13 |
14 | init() {
15 | todos = [
16 | Todo(id: UUID(), title: "Morning workout", isCompleted: false),
17 | Todo(id: UUID(), title: "Sign documents", isCompleted: false),
18 | Todo(id: UUID(), title: "Check email", isCompleted: true),
19 | Todo(id: UUID(), title: "Call boss", isCompleted: false),
20 | Todo(id: UUID(), title: "Buy groceries", isCompleted: false),
21 | Todo(id: UUID(), title: "Finish article", isCompleted: true),
22 | Todo(id: UUID(), title: "Pay bills", isCompleted: true)
23 | ]
24 | }
25 |
26 | }
27 |
28 | // MARK: - DataManagerProtocol
29 | extension MockDataManager: DataManagerProtocol {
30 | func fetchTodoList(includingCompleted: Bool = false) -> [Todo] {
31 | includingCompleted ? todos : todos.filter { !$0.isCompleted }
32 | }
33 |
34 | func addTodo(title: String) {
35 | let todo = Todo(title: title)
36 | todos.insert(todo, at: 0)
37 | }
38 |
39 | func toggleIsCompleted(for todo: Todo) {
40 | if let index = todos.firstIndex(where: { $0.id == todo.id }) {
41 | todos[index].isCompleted.toggle()
42 | }
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-29.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate {
13 |
14 |
15 |
16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
17 | // Override point for customization after application launch.
18 | return true
19 | }
20 |
21 | // MARK: UISceneSession Lifecycle
22 |
23 | func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
24 | // Called when a new scene session is being created.
25 | // Use this method to select a configuration to create the new scene with.
26 | return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
27 | }
28 |
29 | func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {
30 | // Called when the user discards a scene session.
31 | // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
32 | // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
33 | }
34 |
35 |
36 | }
37 |
38 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/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 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Helpers/KeyboardResponder.swift:
--------------------------------------------------------------------------------
1 | //
2 | // KeyboardResponder.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-02-05.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 | import Combine
11 |
12 | protocol KeyboardResponderProtocol {
13 | var currentHeight: CGFloat { get }
14 | var duration: TimeInterval { get }
15 | }
16 |
17 | final class KeyboardResponder: KeyboardResponderProtocol, ObservableObject {
18 | @Published private(set) var currentHeight: CGFloat = 0
19 | private(set) var duration: TimeInterval = 0.3
20 | private var cancellableBag = Set()
21 |
22 | init() {
23 | let keyboardWillShow = NotificationCenter.default.publisher(for: UIResponder.keyboardWillShowNotification)
24 | let keyboardWillHide = NotificationCenter.default.publisher(for: UIResponder.keyboardWillHideNotification)
25 | _ = Publishers.Merge(keyboardWillShow, keyboardWillHide)
26 | .receive(on: RunLoop.main)
27 | .sink { [weak self] in self?.keyboardNotification($0) }
28 | .store(in: &cancellableBag)
29 | }
30 |
31 | private func keyboardNotification(_ notification: Notification) {
32 | let isShowing = notification.name == UIResponder.keyboardWillShowNotification
33 | if let userInfo = notification.userInfo {
34 | duration = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0.0
35 | let endFrame = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
36 | if isShowing {
37 | currentHeight = endFrame?.height ?? 0.0
38 | } else {
39 | currentHeight = 0.0
40 | }
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/Todo List/TodoListView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // TodoListView.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-31.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct TodoListView: View {
12 | @ObservedObject var viewModel = TodoListViewModel()
13 |
14 | @State private var isShowingAddNew = false
15 |
16 | private var addNewButton: some View {
17 | Button(action: {
18 | self.isShowingAddNew.toggle()
19 | }) {
20 | Image(systemName: "plus")
21 | }
22 | }
23 |
24 | private var showCompletedButton: some View {
25 | Button(action: {
26 | self.viewModel.showCompleted.toggle()
27 | }) {
28 | Image(systemName: self.viewModel.showCompleted ? "checkmark.circle.fill" : "checkmark.circle")
29 | }
30 | }
31 |
32 | var body: some View {
33 | NavigationView {
34 | List(viewModel.todos) { todo in
35 | Button(action: {
36 | self.viewModel.toggleIsCompleted(for: todo)
37 | }) {
38 | TodoRow(todo: todo)
39 | }
40 | }
41 | .navigationBarTitle(Text("Todo List"))
42 | .navigationBarItems(leading: showCompletedButton, trailing: addNewButton)
43 | }
44 | .sheet(isPresented: $isShowingAddNew, onDismiss: {
45 | self.viewModel.fetchTodos()
46 | }) {
47 | NewTodoView(viewModel: NewTodoViewModel())
48 | }
49 | .onAppear {
50 | self.viewModel.fetchTodos()
51 | }
52 | }
53 | }
54 |
55 | struct TodoListView_Previews: PreviewProvider {
56 | static var previews: some View {
57 | var view = TodoListView()
58 | view.viewModel = TodoListViewModel(dataManager: MockDataManager())
59 | return view
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/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 | }
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/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 | UISceneConfigurationName
33 | Default Configuration
34 | UISceneDelegateClassName
35 | $(PRODUCT_MODULE_NAME).SceneDelegate
36 |
37 |
38 |
39 |
40 | UILaunchStoryboardName
41 | LaunchScreen
42 | UIRequiredDeviceCapabilities
43 |
44 | armv7
45 |
46 | UISupportedInterfaceOrientations
47 |
48 | UIInterfaceOrientationPortrait
49 | UIInterfaceOrientationLandscapeLeft
50 | UIInterfaceOrientationLandscapeRight
51 |
52 | UISupportedInterfaceOrientations~ipad
53 |
54 | UIInterfaceOrientationPortrait
55 | UIInterfaceOrientationPortraitUpsideDown
56 | UIInterfaceOrientationLandscapeLeft
57 | UIInterfaceOrientationLandscapeRight
58 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/New Todo/NewTodoView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // NewTodoView.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-02-04.
6 | // Copyright © 2020 alexzarr. All rights reserved.
7 | //
8 |
9 | import SwiftUI
10 |
11 | struct NewTodoView: View {
12 | @Environment(\.presentationMode) private var presentationMode: Binding
13 | @ObservedObject var viewModel: NewTodoViewModel
14 |
15 | @ObservedObject private var keyboard = KeyboardResponder()
16 |
17 | @State private var title = ""
18 |
19 | private var isAddButtonDisabled: Bool { // 1
20 | title.isEmpty
21 | }
22 |
23 | private var addButtonColor: Color { // 2
24 | isAddButtonDisabled ? .gray : .blue
25 | }
26 |
27 | var body: some View {
28 | VStack {
29 | Spacer()
30 | TextField("Enter Name", text: $title)
31 | Spacer()
32 | HStack {
33 | Button(action: {
34 | self.presentationMode.wrappedValue.dismiss()
35 | }) {
36 | Text("Cancel")
37 | }
38 | .padding(.vertical, 16.0)
39 | .frame(minWidth: 0, maxWidth: .infinity)
40 |
41 | Button(action: {
42 | if !self.isAddButtonDisabled { // 3
43 | self.viewModel.addNewTodo(title: self.title)
44 | self.presentationMode.wrappedValue.dismiss()
45 | }
46 | }) {
47 | Text("Add")
48 | .foregroundColor(.black) // 4
49 | }
50 | .padding(.vertical, 16.0)
51 | .frame(minWidth: 0, maxWidth: .infinity)
52 | .background(addButtonColor) // 5
53 | .disabled(isAddButtonDisabled) // 5
54 | }
55 | }
56 | .padding()
57 | .padding(.bottom, keyboard.currentHeight)
58 | .animation(.easeOut(duration: keyboard.duration))
59 | }
60 | }
61 |
62 | struct NewTodoView_Previews: PreviewProvider {
63 | static var previews: some View {
64 | NewTodoView(viewModel: NewTodoViewModel())
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Created by https://www.gitignore.io/api/swift
3 | # Edit at https://www.gitignore.io/?templates=swift
4 |
5 | ### Swift ###
6 | # Xcode
7 | #
8 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
9 |
10 | ## Build generated
11 | build/
12 | DerivedData/
13 |
14 | ## Various settings
15 | *.pbxuser
16 | !default.pbxuser
17 | *.mode1v3
18 | !default.mode1v3
19 | *.mode2v3
20 | !default.mode2v3
21 | *.perspectivev3
22 | !default.perspectivev3
23 | xcuserdata/
24 |
25 | ## Other
26 | *.moved-aside
27 | *.xccheckout
28 | *.xcscmblueprint
29 |
30 | ## Obj-C/Swift specific
31 | *.hmap
32 | *.ipa
33 | *.dSYM.zip
34 | *.dSYM
35 |
36 | ## Playgrounds
37 | timeline.xctimeline
38 | playground.xcworkspace
39 |
40 | # Swift Package Manager
41 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
42 | # Packages/
43 | # Package.pins
44 | # Package.resolved
45 | .build/
46 | # Add this line if you want to avoid checking in Xcode SPM integration.
47 | # .swiftpm/xcode
48 |
49 | # CocoaPods
50 | # We recommend against adding the Pods directory to your .gitignore. However
51 | # you should judge for yourself, the pros and cons are mentioned at:
52 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
53 | # Pods/
54 | # Add this line if you want to avoid checking in source code from the Xcode workspace
55 | # *.xcworkspace
56 |
57 | # Carthage
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 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
69 | # screenshots whenever they are needed.
70 | # For more information about the recommended setup visit:
71 | # https://docs.fastlane.tools/best-practices/source-control/#source-control
72 |
73 | fastlane/report.xml
74 | fastlane/Preview.html
75 | fastlane/screenshots/**/*.png
76 | fastlane/test_output
77 |
78 | # Code Injection
79 | # After new code Injection tools there's a generated folder /iOSInjectionProject
80 | # https://github.com/johnno1962/injectionforxcode
81 |
82 | iOSInjectionProject/
83 |
84 | # End of https://www.gitignore.io/api/swift
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList/SceneDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SceneDelegate.swift
3 | // DemoToDoList
4 | //
5 | // Created by Alex Zarr on 2020-01-29.
6 | // Copyright © 2020 alexzarr. 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 | // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
19 | // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
20 | // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
21 |
22 | // Create the SwiftUI view that provides the window contents.
23 | let contentView = TodoListView()
24 |
25 | // Use a UIHostingController as window root view controller.
26 | if let windowScene = scene as? UIWindowScene {
27 | let window = UIWindow(windowScene: windowScene)
28 | window.rootViewController = UIHostingController(rootView: contentView)
29 | self.window = window
30 | window.makeKeyAndVisible()
31 | }
32 | }
33 |
34 | func sceneDidDisconnect(_ scene: UIScene) {
35 | // Called as the scene is being released by the system.
36 | // This occurs shortly after the scene enters the background, or when its session is discarded.
37 | // Release any resources associated with this scene that can be re-created the next time the scene connects.
38 | // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
39 | }
40 |
41 | func sceneDidBecomeActive(_ scene: UIScene) {
42 | // Called when the scene has moved from an inactive state to an active state.
43 | // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
44 | }
45 |
46 | func sceneWillResignActive(_ scene: UIScene) {
47 | // Called when the scene will move from an active state to an inactive state.
48 | // This may occur due to temporary interruptions (ex. an incoming phone call).
49 | }
50 |
51 | func sceneWillEnterForeground(_ scene: UIScene) {
52 | // Called as the scene transitions from the background to the foreground.
53 | // Use this method to undo the changes made on entering the background.
54 | }
55 |
56 | func sceneDidEnterBackground(_ scene: UIScene) {
57 | // Called as the scene transitions from the foreground to the background.
58 | // Use this method to save data, release shared resources, and store enough scene-specific state information
59 | // to restore the scene back to its current state.
60 | }
61 |
62 |
63 | }
64 |
65 |
--------------------------------------------------------------------------------
/DemoToDoList/Modules/DBHelper/DBHelper.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | AC2CF74624043024001A14B2 /* DBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = AC2CF74424043024001A14B2 /* DBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
11 | AC2CF74E240483A5001A14B2 /* DBHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2CF74D240483A5001A14B2 /* DBHelper.swift */; };
12 | AC2CF75C24049195001A14B2 /* DBHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2CF74D240483A5001A14B2 /* DBHelper.swift */; };
13 | AC2CF75D24049195001A14B2 /* DBHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = AC2CF74424043024001A14B2 /* DBHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
14 | /* End PBXBuildFile section */
15 |
16 | /* Begin PBXFileReference section */
17 | AC2CF74124043024001A14B2 /* DBHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DBHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
18 | AC2CF74424043024001A14B2 /* DBHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DBHelper.h; sourceTree = ""; };
19 | AC2CF74524043024001A14B2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
20 | AC2CF74D240483A5001A14B2 /* DBHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DBHelper.swift; sourceTree = ""; };
21 | AC2CF75424049085001A14B2 /* DBHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DBHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
22 | /* End PBXFileReference section */
23 |
24 | /* Begin PBXFrameworksBuildPhase section */
25 | AC2CF73E24043024001A14B2 /* Frameworks */ = {
26 | isa = PBXFrameworksBuildPhase;
27 | buildActionMask = 2147483647;
28 | files = (
29 | );
30 | runOnlyForDeploymentPostprocessing = 0;
31 | };
32 | AC2CF75124049085001A14B2 /* Frameworks */ = {
33 | isa = PBXFrameworksBuildPhase;
34 | buildActionMask = 2147483647;
35 | files = (
36 | );
37 | runOnlyForDeploymentPostprocessing = 0;
38 | };
39 | /* End PBXFrameworksBuildPhase section */
40 |
41 | /* Begin PBXGroup section */
42 | AC2CF73724043024001A14B2 = {
43 | isa = PBXGroup;
44 | children = (
45 | AC2CF74324043024001A14B2 /* DBHelper */,
46 | AC2CF74224043024001A14B2 /* Products */,
47 | );
48 | sourceTree = "";
49 | };
50 | AC2CF74224043024001A14B2 /* Products */ = {
51 | isa = PBXGroup;
52 | children = (
53 | AC2CF74124043024001A14B2 /* DBHelper.framework */,
54 | AC2CF75424049085001A14B2 /* DBHelper.framework */,
55 | );
56 | name = Products;
57 | sourceTree = "";
58 | };
59 | AC2CF74324043024001A14B2 /* DBHelper */ = {
60 | isa = PBXGroup;
61 | children = (
62 | AC2CF74C2404833C001A14B2 /* Sources */,
63 | AC2CF74424043024001A14B2 /* DBHelper.h */,
64 | AC2CF74524043024001A14B2 /* Info.plist */,
65 | );
66 | path = DBHelper;
67 | sourceTree = "";
68 | };
69 | AC2CF74C2404833C001A14B2 /* Sources */ = {
70 | isa = PBXGroup;
71 | children = (
72 | AC2CF74D240483A5001A14B2 /* DBHelper.swift */,
73 | );
74 | path = Sources;
75 | sourceTree = "";
76 | };
77 | /* End PBXGroup section */
78 |
79 | /* Begin PBXHeadersBuildPhase section */
80 | AC2CF73C24043024001A14B2 /* Headers */ = {
81 | isa = PBXHeadersBuildPhase;
82 | buildActionMask = 2147483647;
83 | files = (
84 | AC2CF74624043024001A14B2 /* DBHelper.h in Headers */,
85 | );
86 | runOnlyForDeploymentPostprocessing = 0;
87 | };
88 | AC2CF74F24049085001A14B2 /* Headers */ = {
89 | isa = PBXHeadersBuildPhase;
90 | buildActionMask = 2147483647;
91 | files = (
92 | AC2CF75D24049195001A14B2 /* DBHelper.h in Headers */,
93 | );
94 | runOnlyForDeploymentPostprocessing = 0;
95 | };
96 | /* End PBXHeadersBuildPhase section */
97 |
98 | /* Begin PBXNativeTarget section */
99 | AC2CF74024043024001A14B2 /* DBHelper */ = {
100 | isa = PBXNativeTarget;
101 | buildConfigurationList = AC2CF74924043024001A14B2 /* Build configuration list for PBXNativeTarget "DBHelper" */;
102 | buildPhases = (
103 | AC2CF73C24043024001A14B2 /* Headers */,
104 | AC2CF73D24043024001A14B2 /* Sources */,
105 | AC2CF73E24043024001A14B2 /* Frameworks */,
106 | AC2CF73F24043024001A14B2 /* Resources */,
107 | );
108 | buildRules = (
109 | );
110 | dependencies = (
111 | );
112 | name = DBHelper;
113 | productName = DBHelper;
114 | productReference = AC2CF74124043024001A14B2 /* DBHelper.framework */;
115 | productType = "com.apple.product-type.framework";
116 | };
117 | AC2CF75324049085001A14B2 /* DBHelper watchOS */ = {
118 | isa = PBXNativeTarget;
119 | buildConfigurationList = AC2CF75924049085001A14B2 /* Build configuration list for PBXNativeTarget "DBHelper watchOS" */;
120 | buildPhases = (
121 | AC2CF74F24049085001A14B2 /* Headers */,
122 | AC2CF75024049085001A14B2 /* Sources */,
123 | AC2CF75124049085001A14B2 /* Frameworks */,
124 | AC2CF75224049085001A14B2 /* Resources */,
125 | );
126 | buildRules = (
127 | );
128 | dependencies = (
129 | );
130 | name = "DBHelper watchOS";
131 | productName = "DBHelper watchOS";
132 | productReference = AC2CF75424049085001A14B2 /* DBHelper.framework */;
133 | productType = "com.apple.product-type.framework";
134 | };
135 | /* End PBXNativeTarget section */
136 |
137 | /* Begin PBXProject section */
138 | AC2CF73824043024001A14B2 /* Project object */ = {
139 | isa = PBXProject;
140 | attributes = {
141 | LastUpgradeCheck = 1130;
142 | ORGANIZATIONNAME = alexzarr;
143 | TargetAttributes = {
144 | AC2CF74024043024001A14B2 = {
145 | CreatedOnToolsVersion = 11.3.1;
146 | LastSwiftMigration = 1130;
147 | };
148 | AC2CF75324049085001A14B2 = {
149 | CreatedOnToolsVersion = 11.3.1;
150 | };
151 | };
152 | };
153 | buildConfigurationList = AC2CF73B24043024001A14B2 /* Build configuration list for PBXProject "DBHelper" */;
154 | compatibilityVersion = "Xcode 9.3";
155 | developmentRegion = en;
156 | hasScannedForEncodings = 0;
157 | knownRegions = (
158 | en,
159 | Base,
160 | );
161 | mainGroup = AC2CF73724043024001A14B2;
162 | productRefGroup = AC2CF74224043024001A14B2 /* Products */;
163 | projectDirPath = "";
164 | projectRoot = "";
165 | targets = (
166 | AC2CF74024043024001A14B2 /* DBHelper */,
167 | AC2CF75324049085001A14B2 /* DBHelper watchOS */,
168 | );
169 | };
170 | /* End PBXProject section */
171 |
172 | /* Begin PBXResourcesBuildPhase section */
173 | AC2CF73F24043024001A14B2 /* Resources */ = {
174 | isa = PBXResourcesBuildPhase;
175 | buildActionMask = 2147483647;
176 | files = (
177 | );
178 | runOnlyForDeploymentPostprocessing = 0;
179 | };
180 | AC2CF75224049085001A14B2 /* Resources */ = {
181 | isa = PBXResourcesBuildPhase;
182 | buildActionMask = 2147483647;
183 | files = (
184 | );
185 | runOnlyForDeploymentPostprocessing = 0;
186 | };
187 | /* End PBXResourcesBuildPhase section */
188 |
189 | /* Begin PBXSourcesBuildPhase section */
190 | AC2CF73D24043024001A14B2 /* Sources */ = {
191 | isa = PBXSourcesBuildPhase;
192 | buildActionMask = 2147483647;
193 | files = (
194 | AC2CF74E240483A5001A14B2 /* DBHelper.swift in Sources */,
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | };
198 | AC2CF75024049085001A14B2 /* Sources */ = {
199 | isa = PBXSourcesBuildPhase;
200 | buildActionMask = 2147483647;
201 | files = (
202 | AC2CF75C24049195001A14B2 /* DBHelper.swift in Sources */,
203 | );
204 | runOnlyForDeploymentPostprocessing = 0;
205 | };
206 | /* End PBXSourcesBuildPhase section */
207 |
208 | /* Begin XCBuildConfiguration section */
209 | AC2CF74724043024001A14B2 /* Debug */ = {
210 | isa = XCBuildConfiguration;
211 | buildSettings = {
212 | ALWAYS_SEARCH_USER_PATHS = NO;
213 | CLANG_ANALYZER_NONNULL = YES;
214 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
215 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
216 | CLANG_CXX_LIBRARY = "libc++";
217 | CLANG_ENABLE_MODULES = YES;
218 | CLANG_ENABLE_OBJC_ARC = YES;
219 | CLANG_ENABLE_OBJC_WEAK = YES;
220 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
221 | CLANG_WARN_BOOL_CONVERSION = YES;
222 | CLANG_WARN_COMMA = YES;
223 | CLANG_WARN_CONSTANT_CONVERSION = YES;
224 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
225 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
226 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
227 | CLANG_WARN_EMPTY_BODY = YES;
228 | CLANG_WARN_ENUM_CONVERSION = YES;
229 | CLANG_WARN_INFINITE_RECURSION = YES;
230 | CLANG_WARN_INT_CONVERSION = YES;
231 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
232 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
233 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
234 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
235 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
236 | CLANG_WARN_STRICT_PROTOTYPES = YES;
237 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
238 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
239 | CLANG_WARN_UNREACHABLE_CODE = YES;
240 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
241 | COPY_PHASE_STRIP = NO;
242 | CURRENT_PROJECT_VERSION = 1;
243 | DEBUG_INFORMATION_FORMAT = dwarf;
244 | ENABLE_STRICT_OBJC_MSGSEND = YES;
245 | ENABLE_TESTABILITY = YES;
246 | GCC_C_LANGUAGE_STANDARD = gnu11;
247 | GCC_DYNAMIC_NO_PIC = NO;
248 | GCC_NO_COMMON_BLOCKS = YES;
249 | GCC_OPTIMIZATION_LEVEL = 0;
250 | GCC_PREPROCESSOR_DEFINITIONS = (
251 | "DEBUG=1",
252 | "$(inherited)",
253 | );
254 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
255 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
256 | GCC_WARN_UNDECLARED_SELECTOR = YES;
257 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
258 | GCC_WARN_UNUSED_FUNCTION = YES;
259 | GCC_WARN_UNUSED_VARIABLE = YES;
260 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
261 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
262 | MTL_FAST_MATH = YES;
263 | ONLY_ACTIVE_ARCH = YES;
264 | SDKROOT = iphoneos;
265 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
266 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
267 | VERSIONING_SYSTEM = "apple-generic";
268 | VERSION_INFO_PREFIX = "";
269 | };
270 | name = Debug;
271 | };
272 | AC2CF74824043024001A14B2 /* Release */ = {
273 | isa = XCBuildConfiguration;
274 | buildSettings = {
275 | ALWAYS_SEARCH_USER_PATHS = NO;
276 | CLANG_ANALYZER_NONNULL = YES;
277 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
278 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
279 | CLANG_CXX_LIBRARY = "libc++";
280 | CLANG_ENABLE_MODULES = YES;
281 | CLANG_ENABLE_OBJC_ARC = YES;
282 | CLANG_ENABLE_OBJC_WEAK = YES;
283 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
284 | CLANG_WARN_BOOL_CONVERSION = YES;
285 | CLANG_WARN_COMMA = YES;
286 | CLANG_WARN_CONSTANT_CONVERSION = YES;
287 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
288 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
289 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
290 | CLANG_WARN_EMPTY_BODY = YES;
291 | CLANG_WARN_ENUM_CONVERSION = YES;
292 | CLANG_WARN_INFINITE_RECURSION = YES;
293 | CLANG_WARN_INT_CONVERSION = YES;
294 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
295 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
296 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
297 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
298 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
299 | CLANG_WARN_STRICT_PROTOTYPES = YES;
300 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
301 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
302 | CLANG_WARN_UNREACHABLE_CODE = YES;
303 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
304 | COPY_PHASE_STRIP = NO;
305 | CURRENT_PROJECT_VERSION = 1;
306 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
307 | ENABLE_NS_ASSERTIONS = NO;
308 | ENABLE_STRICT_OBJC_MSGSEND = YES;
309 | GCC_C_LANGUAGE_STANDARD = gnu11;
310 | GCC_NO_COMMON_BLOCKS = YES;
311 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
312 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
313 | GCC_WARN_UNDECLARED_SELECTOR = YES;
314 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
315 | GCC_WARN_UNUSED_FUNCTION = YES;
316 | GCC_WARN_UNUSED_VARIABLE = YES;
317 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
318 | MTL_ENABLE_DEBUG_INFO = NO;
319 | MTL_FAST_MATH = YES;
320 | SDKROOT = iphoneos;
321 | SWIFT_COMPILATION_MODE = wholemodule;
322 | SWIFT_OPTIMIZATION_LEVEL = "-O";
323 | VALIDATE_PRODUCT = YES;
324 | VERSIONING_SYSTEM = "apple-generic";
325 | VERSION_INFO_PREFIX = "";
326 | };
327 | name = Release;
328 | };
329 | AC2CF74A24043024001A14B2 /* Debug */ = {
330 | isa = XCBuildConfiguration;
331 | buildSettings = {
332 | CLANG_ENABLE_MODULES = YES;
333 | CODE_SIGN_STYLE = Automatic;
334 | DEFINES_MODULE = YES;
335 | DEVELOPMENT_TEAM = 7GX5656B4U;
336 | DYLIB_COMPATIBILITY_VERSION = 1;
337 | DYLIB_CURRENT_VERSION = 1;
338 | DYLIB_INSTALL_NAME_BASE = "@rpath";
339 | INFOPLIST_FILE = DBHelper/Info.plist;
340 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
341 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
342 | LD_RUNPATH_SEARCH_PATHS = (
343 | "$(inherited)",
344 | "@executable_path/Frameworks",
345 | "@loader_path/Frameworks",
346 | );
347 | PRODUCT_BUNDLE_IDENTIFIER = com.alexzarr.DBHelper;
348 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
349 | SKIP_INSTALL = YES;
350 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
351 | SWIFT_VERSION = 5.0;
352 | TARGETED_DEVICE_FAMILY = "1,2";
353 | };
354 | name = Debug;
355 | };
356 | AC2CF74B24043024001A14B2 /* Release */ = {
357 | isa = XCBuildConfiguration;
358 | buildSettings = {
359 | CLANG_ENABLE_MODULES = YES;
360 | CODE_SIGN_STYLE = Automatic;
361 | DEFINES_MODULE = YES;
362 | DEVELOPMENT_TEAM = 7GX5656B4U;
363 | DYLIB_COMPATIBILITY_VERSION = 1;
364 | DYLIB_CURRENT_VERSION = 1;
365 | DYLIB_INSTALL_NAME_BASE = "@rpath";
366 | INFOPLIST_FILE = DBHelper/Info.plist;
367 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
368 | IPHONEOS_DEPLOYMENT_TARGET = 13.0;
369 | LD_RUNPATH_SEARCH_PATHS = (
370 | "$(inherited)",
371 | "@executable_path/Frameworks",
372 | "@loader_path/Frameworks",
373 | );
374 | PRODUCT_BUNDLE_IDENTIFIER = com.alexzarr.DBHelper;
375 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
376 | SKIP_INSTALL = YES;
377 | SWIFT_VERSION = 5.0;
378 | TARGETED_DEVICE_FAMILY = "1,2";
379 | };
380 | name = Release;
381 | };
382 | AC2CF75A24049085001A14B2 /* Debug */ = {
383 | isa = XCBuildConfiguration;
384 | buildSettings = {
385 | APPLICATION_EXTENSION_API_ONLY = YES;
386 | CODE_SIGN_STYLE = Automatic;
387 | DEFINES_MODULE = YES;
388 | DEVELOPMENT_TEAM = 7GX5656B4U;
389 | DYLIB_COMPATIBILITY_VERSION = 1;
390 | DYLIB_CURRENT_VERSION = 1;
391 | DYLIB_INSTALL_NAME_BASE = "@rpath";
392 | INFOPLIST_FILE = DBHelper/Info.plist;
393 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
394 | LD_RUNPATH_SEARCH_PATHS = (
395 | "$(inherited)",
396 | "@executable_path/Frameworks",
397 | "@loader_path/Frameworks",
398 | );
399 | PRODUCT_BUNDLE_IDENTIFIER = "com.alexzarr.DBHelper-watchOS";
400 | PRODUCT_NAME = "$(PROJECT_NAME)";
401 | SDKROOT = watchos;
402 | SKIP_INSTALL = YES;
403 | SWIFT_VERSION = 5.0;
404 | TARGETED_DEVICE_FAMILY = 4;
405 | WATCHOS_DEPLOYMENT_TARGET = 6.1;
406 | };
407 | name = Debug;
408 | };
409 | AC2CF75B24049085001A14B2 /* Release */ = {
410 | isa = XCBuildConfiguration;
411 | buildSettings = {
412 | APPLICATION_EXTENSION_API_ONLY = YES;
413 | CODE_SIGN_STYLE = Automatic;
414 | DEFINES_MODULE = YES;
415 | DEVELOPMENT_TEAM = 7GX5656B4U;
416 | DYLIB_COMPATIBILITY_VERSION = 1;
417 | DYLIB_CURRENT_VERSION = 1;
418 | DYLIB_INSTALL_NAME_BASE = "@rpath";
419 | INFOPLIST_FILE = DBHelper/Info.plist;
420 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
421 | LD_RUNPATH_SEARCH_PATHS = (
422 | "$(inherited)",
423 | "@executable_path/Frameworks",
424 | "@loader_path/Frameworks",
425 | );
426 | PRODUCT_BUNDLE_IDENTIFIER = "com.alexzarr.DBHelper-watchOS";
427 | PRODUCT_NAME = "$(PROJECT_NAME)";
428 | SDKROOT = watchos;
429 | SKIP_INSTALL = YES;
430 | SWIFT_VERSION = 5.0;
431 | TARGETED_DEVICE_FAMILY = 4;
432 | WATCHOS_DEPLOYMENT_TARGET = 6.1;
433 | };
434 | name = Release;
435 | };
436 | /* End XCBuildConfiguration section */
437 |
438 | /* Begin XCConfigurationList section */
439 | AC2CF73B24043024001A14B2 /* Build configuration list for PBXProject "DBHelper" */ = {
440 | isa = XCConfigurationList;
441 | buildConfigurations = (
442 | AC2CF74724043024001A14B2 /* Debug */,
443 | AC2CF74824043024001A14B2 /* Release */,
444 | );
445 | defaultConfigurationIsVisible = 0;
446 | defaultConfigurationName = Release;
447 | };
448 | AC2CF74924043024001A14B2 /* Build configuration list for PBXNativeTarget "DBHelper" */ = {
449 | isa = XCConfigurationList;
450 | buildConfigurations = (
451 | AC2CF74A24043024001A14B2 /* Debug */,
452 | AC2CF74B24043024001A14B2 /* Release */,
453 | );
454 | defaultConfigurationIsVisible = 0;
455 | defaultConfigurationName = Release;
456 | };
457 | AC2CF75924049085001A14B2 /* Build configuration list for PBXNativeTarget "DBHelper watchOS" */ = {
458 | isa = XCConfigurationList;
459 | buildConfigurations = (
460 | AC2CF75A24049085001A14B2 /* Debug */,
461 | AC2CF75B24049085001A14B2 /* Release */,
462 | );
463 | defaultConfigurationIsVisible = 0;
464 | defaultConfigurationName = Release;
465 | };
466 | /* End XCConfigurationList section */
467 | };
468 | rootObject = AC2CF73824043024001A14B2 /* Project object */;
469 | }
470 |
--------------------------------------------------------------------------------
/DemoToDoList/DemoToDoList.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 50;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | AC25973A23E2016000CC57C6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25973923E2016000CC57C6 /* AppDelegate.swift */; };
11 | AC25973C23E2016000CC57C6 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25973B23E2016000CC57C6 /* SceneDelegate.swift */; };
12 | AC25973E23E2016000CC57C6 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25973D23E2016000CC57C6 /* ContentView.swift */; };
13 | AC25974023E2016400CC57C6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AC25973F23E2016400CC57C6 /* Assets.xcassets */; };
14 | AC25974323E2016400CC57C6 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AC25974223E2016400CC57C6 /* Preview Assets.xcassets */; };
15 | AC25974623E2016400CC57C6 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AC25974423E2016400CC57C6 /* LaunchScreen.storyboard */; };
16 | AC25974E23E20F8D00CC57C6 /* Todo.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25974D23E20F8D00CC57C6 /* Todo.swift */; };
17 | AC2597E523E253A000CC57C6 /* DataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2597E423E253A000CC57C6 /* DataManager.swift */; };
18 | AC2597E823E4850900CC57C6 /* TodoListViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC2597E723E4850900CC57C6 /* TodoListViewModel.swift */; };
19 | AC25981723E4CB4800CC57C6 /* TodoListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25981623E4CB4800CC57C6 /* TodoListView.swift */; };
20 | AC25982423E511DE00CC57C6 /* MockDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC25982323E511DE00CC57C6 /* MockDataManager.swift */; };
21 | AC2CF760240493EB001A14B2 /* DBHelper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC2CF75F240493EB001A14B2 /* DBHelper.framework */; };
22 | AC2CF761240493EB001A14B2 /* DBHelper.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = AC2CF75F240493EB001A14B2 /* DBHelper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
23 | AC32CB4A23F4A1F000E92696 /* TodoRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC32CB4923F4A1F000E92696 /* TodoRow.swift */; };
24 | AC9F2D3B23E9E08600E96DD1 /* NewTodoViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9F2D3A23E9E08600E96DD1 /* NewTodoViewModel.swift */; };
25 | AC9F2D3E23E9F87800E96DD1 /* NewTodoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC9F2D3D23E9F87800E96DD1 /* NewTodoView.swift */; };
26 | ACC4FED923EB2F9C00F0AF72 /* KeyboardResponder.swift in Sources */ = {isa = PBXBuildFile; fileRef = ACC4FED823EB2F9C00F0AF72 /* KeyboardResponder.swift */; };
27 | /* End PBXBuildFile section */
28 |
29 | /* Begin PBXCopyFilesBuildPhase section */
30 | AC2CF762240493EB001A14B2 /* Embed Frameworks */ = {
31 | isa = PBXCopyFilesBuildPhase;
32 | buildActionMask = 2147483647;
33 | dstPath = "";
34 | dstSubfolderSpec = 10;
35 | files = (
36 | AC2CF761240493EB001A14B2 /* DBHelper.framework in Embed Frameworks */,
37 | );
38 | name = "Embed Frameworks";
39 | runOnlyForDeploymentPostprocessing = 0;
40 | };
41 | /* End PBXCopyFilesBuildPhase section */
42 |
43 | /* Begin PBXFileReference section */
44 | AC25973623E2016000CC57C6 /* DemoToDoList.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DemoToDoList.app; sourceTree = BUILT_PRODUCTS_DIR; };
45 | AC25973923E2016000CC57C6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
46 | AC25973B23E2016000CC57C6 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
47 | AC25973D23E2016000CC57C6 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
48 | AC25973F23E2016400CC57C6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
49 | AC25974223E2016400CC57C6 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
50 | AC25974523E2016400CC57C6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
51 | AC25974723E2016400CC57C6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
52 | AC25974D23E20F8D00CC57C6 /* Todo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Todo.swift; sourceTree = ""; };
53 | AC2597E423E253A000CC57C6 /* DataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataManager.swift; sourceTree = ""; };
54 | AC2597E723E4850900CC57C6 /* TodoListViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoListViewModel.swift; sourceTree = ""; };
55 | AC25981623E4CB4800CC57C6 /* TodoListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoListView.swift; sourceTree = ""; };
56 | AC25982323E511DE00CC57C6 /* MockDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockDataManager.swift; sourceTree = ""; };
57 | AC2CF75F240493EB001A14B2 /* DBHelper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DBHelper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
58 | AC32CB4923F4A1F000E92696 /* TodoRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoRow.swift; sourceTree = ""; };
59 | AC9F2D3A23E9E08600E96DD1 /* NewTodoViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTodoViewModel.swift; sourceTree = ""; };
60 | AC9F2D3D23E9F87800E96DD1 /* NewTodoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewTodoView.swift; sourceTree = ""; };
61 | ACC4FED823EB2F9C00F0AF72 /* KeyboardResponder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyboardResponder.swift; sourceTree = ""; };
62 | /* End PBXFileReference section */
63 |
64 | /* Begin PBXFrameworksBuildPhase section */
65 | AC25973323E2016000CC57C6 /* Frameworks */ = {
66 | isa = PBXFrameworksBuildPhase;
67 | buildActionMask = 2147483647;
68 | files = (
69 | AC2CF760240493EB001A14B2 /* DBHelper.framework in Frameworks */,
70 | );
71 | runOnlyForDeploymentPostprocessing = 0;
72 | };
73 | /* End PBXFrameworksBuildPhase section */
74 |
75 | /* Begin PBXGroup section */
76 | AC25972D23E2016000CC57C6 = {
77 | isa = PBXGroup;
78 | children = (
79 | AC25973823E2016000CC57C6 /* DemoToDoList */,
80 | AC25973723E2016000CC57C6 /* Products */,
81 | AC2CF75E240493EB001A14B2 /* Frameworks */,
82 | );
83 | sourceTree = "";
84 | };
85 | AC25973723E2016000CC57C6 /* Products */ = {
86 | isa = PBXGroup;
87 | children = (
88 | AC25973623E2016000CC57C6 /* DemoToDoList.app */,
89 | );
90 | name = Products;
91 | sourceTree = "";
92 | };
93 | AC25973823E2016000CC57C6 /* DemoToDoList */ = {
94 | isa = PBXGroup;
95 | children = (
96 | AC41670823EC6CE700FD3393 /* Helpers */,
97 | AC25982523E511F000CC57C6 /* Mock */,
98 | AC25973923E2016000CC57C6 /* AppDelegate.swift */,
99 | AC25973B23E2016000CC57C6 /* SceneDelegate.swift */,
100 | AC25973D23E2016000CC57C6 /* ContentView.swift */,
101 | AC9F2D3C23E9E08900E96DD1 /* New Todo */,
102 | AC2597E923E4851000CC57C6 /* Todo List */,
103 | AC2597E623E253A300CC57C6 /* Managers */,
104 | AC25974F23E20F9F00CC57C6 /* Model */,
105 | AC25973F23E2016400CC57C6 /* Assets.xcassets */,
106 | AC25974423E2016400CC57C6 /* LaunchScreen.storyboard */,
107 | AC25974723E2016400CC57C6 /* Info.plist */,
108 | AC25974123E2016400CC57C6 /* Preview Content */,
109 | );
110 | path = DemoToDoList;
111 | sourceTree = "";
112 | };
113 | AC25974123E2016400CC57C6 /* Preview Content */ = {
114 | isa = PBXGroup;
115 | children = (
116 | AC25974223E2016400CC57C6 /* Preview Assets.xcassets */,
117 | );
118 | path = "Preview Content";
119 | sourceTree = "";
120 | };
121 | AC25974F23E20F9F00CC57C6 /* Model */ = {
122 | isa = PBXGroup;
123 | children = (
124 | AC25974D23E20F8D00CC57C6 /* Todo.swift */,
125 | );
126 | path = Model;
127 | sourceTree = "";
128 | };
129 | AC2597E623E253A300CC57C6 /* Managers */ = {
130 | isa = PBXGroup;
131 | children = (
132 | AC2597E423E253A000CC57C6 /* DataManager.swift */,
133 | );
134 | path = Managers;
135 | sourceTree = "";
136 | };
137 | AC2597E923E4851000CC57C6 /* Todo List */ = {
138 | isa = PBXGroup;
139 | children = (
140 | AC25981623E4CB4800CC57C6 /* TodoListView.swift */,
141 | AC2597E723E4850900CC57C6 /* TodoListViewModel.swift */,
142 | AC32CB4923F4A1F000E92696 /* TodoRow.swift */,
143 | );
144 | path = "Todo List";
145 | sourceTree = "";
146 | };
147 | AC25982523E511F000CC57C6 /* Mock */ = {
148 | isa = PBXGroup;
149 | children = (
150 | AC25982323E511DE00CC57C6 /* MockDataManager.swift */,
151 | );
152 | path = Mock;
153 | sourceTree = "";
154 | };
155 | AC2CF75E240493EB001A14B2 /* Frameworks */ = {
156 | isa = PBXGroup;
157 | children = (
158 | AC2CF75F240493EB001A14B2 /* DBHelper.framework */,
159 | );
160 | name = Frameworks;
161 | sourceTree = "";
162 | };
163 | AC41670823EC6CE700FD3393 /* Helpers */ = {
164 | isa = PBXGroup;
165 | children = (
166 | ACC4FED823EB2F9C00F0AF72 /* KeyboardResponder.swift */,
167 | );
168 | path = Helpers;
169 | sourceTree = "";
170 | };
171 | AC9F2D3C23E9E08900E96DD1 /* New Todo */ = {
172 | isa = PBXGroup;
173 | children = (
174 | AC9F2D3A23E9E08600E96DD1 /* NewTodoViewModel.swift */,
175 | AC9F2D3D23E9F87800E96DD1 /* NewTodoView.swift */,
176 | );
177 | path = "New Todo";
178 | sourceTree = "";
179 | };
180 | /* End PBXGroup section */
181 |
182 | /* Begin PBXNativeTarget section */
183 | AC25973523E2016000CC57C6 /* DemoToDoList */ = {
184 | isa = PBXNativeTarget;
185 | buildConfigurationList = AC25974A23E2016400CC57C6 /* Build configuration list for PBXNativeTarget "DemoToDoList" */;
186 | buildPhases = (
187 | AC25973223E2016000CC57C6 /* Sources */,
188 | AC25973323E2016000CC57C6 /* Frameworks */,
189 | AC25973423E2016000CC57C6 /* Resources */,
190 | AC2CF762240493EB001A14B2 /* Embed Frameworks */,
191 | );
192 | buildRules = (
193 | );
194 | dependencies = (
195 | );
196 | name = DemoToDoList;
197 | productName = DemoToDoList;
198 | productReference = AC25973623E2016000CC57C6 /* DemoToDoList.app */;
199 | productType = "com.apple.product-type.application";
200 | };
201 | /* End PBXNativeTarget section */
202 |
203 | /* Begin PBXProject section */
204 | AC25972E23E2016000CC57C6 /* Project object */ = {
205 | isa = PBXProject;
206 | attributes = {
207 | LastSwiftUpdateCheck = 1130;
208 | LastUpgradeCheck = 1130;
209 | ORGANIZATIONNAME = alexzarr;
210 | TargetAttributes = {
211 | AC25973523E2016000CC57C6 = {
212 | CreatedOnToolsVersion = 11.3.1;
213 | };
214 | };
215 | };
216 | buildConfigurationList = AC25973123E2016000CC57C6 /* Build configuration list for PBXProject "DemoToDoList" */;
217 | compatibilityVersion = "Xcode 9.3";
218 | developmentRegion = en;
219 | hasScannedForEncodings = 0;
220 | knownRegions = (
221 | en,
222 | Base,
223 | );
224 | mainGroup = AC25972D23E2016000CC57C6;
225 | productRefGroup = AC25973723E2016000CC57C6 /* Products */;
226 | projectDirPath = "";
227 | projectRoot = "";
228 | targets = (
229 | AC25973523E2016000CC57C6 /* DemoToDoList */,
230 | );
231 | };
232 | /* End PBXProject section */
233 |
234 | /* Begin PBXResourcesBuildPhase section */
235 | AC25973423E2016000CC57C6 /* Resources */ = {
236 | isa = PBXResourcesBuildPhase;
237 | buildActionMask = 2147483647;
238 | files = (
239 | AC25974623E2016400CC57C6 /* LaunchScreen.storyboard in Resources */,
240 | AC25974323E2016400CC57C6 /* Preview Assets.xcassets in Resources */,
241 | AC25974023E2016400CC57C6 /* Assets.xcassets in Resources */,
242 | );
243 | runOnlyForDeploymentPostprocessing = 0;
244 | };
245 | /* End PBXResourcesBuildPhase section */
246 |
247 | /* Begin PBXSourcesBuildPhase section */
248 | AC25973223E2016000CC57C6 /* Sources */ = {
249 | isa = PBXSourcesBuildPhase;
250 | buildActionMask = 2147483647;
251 | files = (
252 | AC25973A23E2016000CC57C6 /* AppDelegate.swift in Sources */,
253 | AC2597E523E253A000CC57C6 /* DataManager.swift in Sources */,
254 | AC32CB4A23F4A1F000E92696 /* TodoRow.swift in Sources */,
255 | AC25973C23E2016000CC57C6 /* SceneDelegate.swift in Sources */,
256 | ACC4FED923EB2F9C00F0AF72 /* KeyboardResponder.swift in Sources */,
257 | AC9F2D3E23E9F87800E96DD1 /* NewTodoView.swift in Sources */,
258 | AC25973E23E2016000CC57C6 /* ContentView.swift in Sources */,
259 | AC25981723E4CB4800CC57C6 /* TodoListView.swift in Sources */,
260 | AC9F2D3B23E9E08600E96DD1 /* NewTodoViewModel.swift in Sources */,
261 | AC2597E823E4850900CC57C6 /* TodoListViewModel.swift in Sources */,
262 | AC25974E23E20F8D00CC57C6 /* Todo.swift in Sources */,
263 | AC25982423E511DE00CC57C6 /* MockDataManager.swift in Sources */,
264 | );
265 | runOnlyForDeploymentPostprocessing = 0;
266 | };
267 | /* End PBXSourcesBuildPhase section */
268 |
269 | /* Begin PBXVariantGroup section */
270 | AC25974423E2016400CC57C6 /* LaunchScreen.storyboard */ = {
271 | isa = PBXVariantGroup;
272 | children = (
273 | AC25974523E2016400CC57C6 /* Base */,
274 | );
275 | name = LaunchScreen.storyboard;
276 | sourceTree = "";
277 | };
278 | /* End PBXVariantGroup section */
279 |
280 | /* Begin XCBuildConfiguration section */
281 | AC25974823E2016400CC57C6 /* Debug */ = {
282 | isa = XCBuildConfiguration;
283 | buildSettings = {
284 | ALWAYS_SEARCH_USER_PATHS = NO;
285 | CLANG_ANALYZER_NONNULL = YES;
286 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
287 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
288 | CLANG_CXX_LIBRARY = "libc++";
289 | CLANG_ENABLE_MODULES = YES;
290 | CLANG_ENABLE_OBJC_ARC = YES;
291 | CLANG_ENABLE_OBJC_WEAK = YES;
292 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
293 | CLANG_WARN_BOOL_CONVERSION = YES;
294 | CLANG_WARN_COMMA = YES;
295 | CLANG_WARN_CONSTANT_CONVERSION = YES;
296 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
297 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
298 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
299 | CLANG_WARN_EMPTY_BODY = YES;
300 | CLANG_WARN_ENUM_CONVERSION = YES;
301 | CLANG_WARN_INFINITE_RECURSION = YES;
302 | CLANG_WARN_INT_CONVERSION = YES;
303 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
304 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
305 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
306 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
307 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
308 | CLANG_WARN_STRICT_PROTOTYPES = YES;
309 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
310 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
311 | CLANG_WARN_UNREACHABLE_CODE = YES;
312 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
313 | COPY_PHASE_STRIP = NO;
314 | DEBUG_INFORMATION_FORMAT = dwarf;
315 | ENABLE_STRICT_OBJC_MSGSEND = YES;
316 | ENABLE_TESTABILITY = YES;
317 | GCC_C_LANGUAGE_STANDARD = gnu11;
318 | GCC_DYNAMIC_NO_PIC = NO;
319 | GCC_NO_COMMON_BLOCKS = YES;
320 | GCC_OPTIMIZATION_LEVEL = 0;
321 | GCC_PREPROCESSOR_DEFINITIONS = (
322 | "DEBUG=1",
323 | "$(inherited)",
324 | );
325 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
326 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
327 | GCC_WARN_UNDECLARED_SELECTOR = YES;
328 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
329 | GCC_WARN_UNUSED_FUNCTION = YES;
330 | GCC_WARN_UNUSED_VARIABLE = YES;
331 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
332 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
333 | MTL_FAST_MATH = YES;
334 | ONLY_ACTIVE_ARCH = YES;
335 | SDKROOT = iphoneos;
336 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
337 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
338 | };
339 | name = Debug;
340 | };
341 | AC25974923E2016400CC57C6 /* Release */ = {
342 | isa = XCBuildConfiguration;
343 | buildSettings = {
344 | ALWAYS_SEARCH_USER_PATHS = NO;
345 | CLANG_ANALYZER_NONNULL = YES;
346 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
347 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
348 | CLANG_CXX_LIBRARY = "libc++";
349 | CLANG_ENABLE_MODULES = YES;
350 | CLANG_ENABLE_OBJC_ARC = YES;
351 | CLANG_ENABLE_OBJC_WEAK = YES;
352 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
353 | CLANG_WARN_BOOL_CONVERSION = YES;
354 | CLANG_WARN_COMMA = YES;
355 | CLANG_WARN_CONSTANT_CONVERSION = YES;
356 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
357 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
358 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
359 | CLANG_WARN_EMPTY_BODY = YES;
360 | CLANG_WARN_ENUM_CONVERSION = YES;
361 | CLANG_WARN_INFINITE_RECURSION = YES;
362 | CLANG_WARN_INT_CONVERSION = YES;
363 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
364 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
365 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
366 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
367 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
368 | CLANG_WARN_STRICT_PROTOTYPES = YES;
369 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
370 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
371 | CLANG_WARN_UNREACHABLE_CODE = YES;
372 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
373 | COPY_PHASE_STRIP = NO;
374 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
375 | ENABLE_NS_ASSERTIONS = NO;
376 | ENABLE_STRICT_OBJC_MSGSEND = YES;
377 | GCC_C_LANGUAGE_STANDARD = gnu11;
378 | GCC_NO_COMMON_BLOCKS = YES;
379 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
380 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
381 | GCC_WARN_UNDECLARED_SELECTOR = YES;
382 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
383 | GCC_WARN_UNUSED_FUNCTION = YES;
384 | GCC_WARN_UNUSED_VARIABLE = YES;
385 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
386 | MTL_ENABLE_DEBUG_INFO = NO;
387 | MTL_FAST_MATH = YES;
388 | SDKROOT = iphoneos;
389 | SWIFT_COMPILATION_MODE = wholemodule;
390 | SWIFT_OPTIMIZATION_LEVEL = "-O";
391 | VALIDATE_PRODUCT = YES;
392 | };
393 | name = Release;
394 | };
395 | AC25974B23E2016400CC57C6 /* Debug */ = {
396 | isa = XCBuildConfiguration;
397 | buildSettings = {
398 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
399 | CODE_SIGN_STYLE = Automatic;
400 | DEVELOPMENT_ASSET_PATHS = "\"DemoToDoList/Preview Content\"";
401 | DEVELOPMENT_TEAM = 7GX5656B4U;
402 | ENABLE_PREVIEWS = YES;
403 | INFOPLIST_FILE = DemoToDoList/Info.plist;
404 | LD_RUNPATH_SEARCH_PATHS = (
405 | "$(inherited)",
406 | "@executable_path/Frameworks",
407 | );
408 | PRODUCT_BUNDLE_IDENTIFIER = com.alexzarr.DemoToDoList;
409 | PRODUCT_NAME = "$(TARGET_NAME)";
410 | SWIFT_VERSION = 5.0;
411 | TARGETED_DEVICE_FAMILY = "1,2";
412 | };
413 | name = Debug;
414 | };
415 | AC25974C23E2016400CC57C6 /* Release */ = {
416 | isa = XCBuildConfiguration;
417 | buildSettings = {
418 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
419 | CODE_SIGN_STYLE = Automatic;
420 | DEVELOPMENT_ASSET_PATHS = "\"DemoToDoList/Preview Content\"";
421 | DEVELOPMENT_TEAM = 7GX5656B4U;
422 | ENABLE_PREVIEWS = YES;
423 | INFOPLIST_FILE = DemoToDoList/Info.plist;
424 | LD_RUNPATH_SEARCH_PATHS = (
425 | "$(inherited)",
426 | "@executable_path/Frameworks",
427 | );
428 | PRODUCT_BUNDLE_IDENTIFIER = com.alexzarr.DemoToDoList;
429 | PRODUCT_NAME = "$(TARGET_NAME)";
430 | SWIFT_VERSION = 5.0;
431 | TARGETED_DEVICE_FAMILY = "1,2";
432 | };
433 | name = Release;
434 | };
435 | /* End XCBuildConfiguration section */
436 |
437 | /* Begin XCConfigurationList section */
438 | AC25973123E2016000CC57C6 /* Build configuration list for PBXProject "DemoToDoList" */ = {
439 | isa = XCConfigurationList;
440 | buildConfigurations = (
441 | AC25974823E2016400CC57C6 /* Debug */,
442 | AC25974923E2016400CC57C6 /* Release */,
443 | );
444 | defaultConfigurationIsVisible = 0;
445 | defaultConfigurationName = Release;
446 | };
447 | AC25974A23E2016400CC57C6 /* Build configuration list for PBXNativeTarget "DemoToDoList" */ = {
448 | isa = XCConfigurationList;
449 | buildConfigurations = (
450 | AC25974B23E2016400CC57C6 /* Debug */,
451 | AC25974C23E2016400CC57C6 /* Release */,
452 | );
453 | defaultConfigurationIsVisible = 0;
454 | defaultConfigurationName = Release;
455 | };
456 | /* End XCConfigurationList section */
457 | };
458 | rootObject = AC25972E23E2016000CC57C6 /* Project object */;
459 | }
460 |
--------------------------------------------------------------------------------