100 Days of Swift
Start Date: June 5, 2019
End Date: September 27, 2019
I wanted to learn how to program in the Swift language. To this end, I practiced coding in Swift for at least one hour every day for 100 days.
I started by working through the first two chpaters of The Swift Programming Language ebook from Apple.
I then started my venture by working through example iOS projects by Hacking with Swift. Each project has its own directory in this repository.
Eventually, I garnered the confidence to start my own apps, the Plant Tracker and the Germination Tracker (can you detect a theme?). These are still in development, but entirely open source on my GitHub.
I have finished my 100 Days of Swift. I learned so much - it was like drinking out of a firehose, most days. But this is what I loved! I looked forward to learning something new each day, and was never disappointed. At the end, I feel confident in my ability to learn a new Swift or iOS skill, if needed, thereby removing any hesitation in trying to add a new feature to an app or trying out new use-cases for the language. This is likely the most valuable asset to take away from this excercise.
Moving forward, my short-term plan is to keep working on the apps I've started before doing another 100 Days of X. Also, I want to return to Hacking with Swift to learn more iOS development basics. Afterwards, I will likely do another 100 Days of something, but have yet to decide on the topic. I have a short-list, and, at the moment, Data Science/ML with Swift is at the top.
Unitl then, the best way to see what I'm up to is to keep an eye on my website, Twitter, and GitHub (all linked above). Also, I frequently attend Swift/iOS-based meetups in Boston. Feel free to get in touch if you have any questions or comments!
Day 1 - June 5, 2019: I have begun the introduction to Swift. We have covered the standard variables types, flow control, and the basics of functions and closures.
Day 2 - June 6, 2019: We were introduced to classes, enums, and structs. While I know these are important in OOP, I have very little experience with them, so I made sure to understand the basics.
Day 3 - June 7, 2019: We finished A Swift Tour and are now working through the Language Guide. The tour ended with protocols and error handling. So far, the Language Guide is covering the basics of variables and constants.
Day 4 - June 8, 2019: We finished the basics of numerics, booleans, and tuples. I worked for a second hour and covered optionals and finished up the chapter on basics. I completed a third hour where I learned about the basic operators available in Swift.
Day 5 - June 9, 2019: Began the chapter of the language guide on Strings and Characters. Among other features of Strings in Swift, I learned about Unicode characters, indexing, and adding and removing characters.
Day 6 - June 10, 2019: Finished up Strings and Characters and moved on to Collection Types (arrays, sets, and dictionaries). Covered arrays and sets.
Day 7 - June 11, 2019: I learned about dictionaries to finish up the Collection Types chapter. I has starting the Control Flow chapter, learning about for loops, while loops, if-else statements, and switch-case statements. I finished off the day with an additional short session on control transfer statement (eg.
break, etc.) and on guard statements, an interesting tool that I have never seen before.
Day 8 - June 12, 2019: I began the chapter on Functions learning about the many options for defining and naming parameters, how to return mutliple paramters, and use in-out paramters (I've seen the
¶m in C++ before, but didn't know what it was doing).
Day 9 - June 13, 2019: I finished up functions by learning how Swift defines and leverages their type. I have almost completed the next chapter on Closures; though it is a short chapter, the concepts were very new to me, so I had to slow down.
Day 10 - June 14, 2019: Learned about enumerations, an entirely new subject for me. They seem very useful through, especially in OOP.
Day 11 - June 15, 2019: I worked through the (suprizingly short) chapter on Classes and Structures. I have started the Properties chapter loearning about properties of classes and structures - this is the farthest I have gome into OOP.
Day 12 - June 16, 2019: I learned about structure, enumeration, and class properties, including stored, lazy stored, computed, and type properties. I began the chapter on Methods, learning about instance methods in classes and mutating instance methods for structures and enumerations. I came back to this for some extra coding in the evening and finished the section on Methods, learning about type methods.
Day 13 - June 17, 2019: Covered inheritance of classes and how to create custom subscript behavior for a class. I have started the chapter in intializers for classes, structures, and enumerations, though have only touched the basics.
Day 14 - June 18, 2019: Still working through initializers; I covered initializer delegation and inheritance today, finishing it failable initializers. I completed a second hour in the evening and finished up the initialization chapter. I then completed the deinitialization chapter and began the chapter on optional chaining.
Day 15 - June 19, 2019: Finished up optional chaining; I understood everything I read, but I think this will take some getting used to in real life - it's another thing to keep in mind while programming. I also started error handling.
Day 16 - June 20, 2019: I did not get in a full hour today - busy and late day in lab - but I'll make up for it tomorrow. I did finish up error handling and will be starting type casting.
Day 17 - June 21, 2019: Covered type casting - I was suprized to learn about the seemingly flippant
AnyObject types. I also covered nested types where enums or structs can be nested within others and called using subscript dot syntax. Finally, I began extensions which seem like a very powerful feature.
Day 18 - June 22, 2019: Finished up extensions where I learned how to add methods, subscripts, and nested types to existing types. I then bagan the section on protocols.
Day 19 - June 23, 2019: Still working on protocols (one more section left). Today I covered extending an already existing type to conform to a protocol, defining collection types as protocols, protocol inheritance, class-only protocols, protocol composition, checking for conformance, and optional requirements (which may be obvious from the oxymoronic name, seems to defeat the purpose of protocols).
Day 20 - June 24, 2019: Finished protocols by learning how to extend them (and by relation, all of their conforming types). I then moved on to learning about generics including creating generic functions and generic types, and how to extend them and add type constrains. I started the section on using associated types in protocols.
Day 21 - June 25, 2019: Finished up the Generics chapter learning about generic
where clauses and generic subscripts. (I did this on the plane, and thus was not as efficient as normal.)
Day 22 - June 26, 2019: Learned about the Automatric Reference Counting system used in Swift. I also completed on the chapter on memory safety (to make up for yesterday). I continued with starting the Access Control chapter later in the evening.
Day 23 - June 27, 2019: Learned about more aspects of Access Control. This seems like a topic that will take some practice in real-world applications to get a strong understanding of. I completed the advanced operators chapter where I learned aobut bitwise operations, operator methods, and custom operators. This finishes the Language Guide and is where I will stop in the The Swift Programming Language book. I also took a few minutes at the end of day to start the "Storm Viewer" app project, the first example in Hacking with Swift.
Day 24 - June 28, 2019: Finished the "Storm Viewer" app (see GIF in that directory's README). In general, I learned how to create multiple view controllers and link them to the Interface Builder. I also completed the challenge problems on my own (sorting the images, increasing their title font size, and changing the image view title to "Picture X of Y"). At the end of the day, I decided to begin the next Project: creating the game "Guess the Flag." I learned about an app bundle's Assets.xcassets directory and how to control some aesthetics of the buttons.
Day 25 - June 29, 2019: Finished the "Guess the Flag" game app. The major topics I learned about where UI Alerts and registering and distinguishing button taps. I also completed project 3 which was to add a sharable action button to the navigation bar of each image in Project 1 "Storm Viewer."
Day 26 - June 30, 2019: Completed the last challenge for Project 3 which was to add a right bar button in "Guess the Flag" to cause a pop-up to show the current score. I also started project 4, "Easy Browser," which is a simple introduction to WebKit's WKWebView. I also modified the tutorial's code to use a dictionary of webstites and iterate over them to add to the "Open" controller options instead of manually listing all of the websites. I continued working on the browser project in the evening. I add a tool bar to the bottom for backward/forward navigation, a loading progress bar, a share button (my own addition) and a refresh button. There is also a feature that blocks unknown hosting names and an alert pops up if a clicked link is blocked.
Day 27 - July 1, 2019: I started and completed the main portion of project 5, the "Word Scramble" game app. There I learned about requesting user input and boolean logic. I also went a bit further and defined structures to control the failure messages for the user. I finished the additional challenges by adding a left bar button to start a new game. I then started project 6 about using Auto Layout by updating project 2, the "Guess the Flag" game, to work in landscape.
Day 28 - July 2, 2019: I learned how to create a layout using Auto Layout and constraints. The example uses the safe area constrains on the leading edge (where the text is) but not the trailing edge (where there is not text to protect). I learned how to request and parse a JSON file in the "Whitehouse Petitions" project. I completed the challenges: 1) add a credits pop-up, 2) add more information to each petition detailed view, 3) allow for filtering by the petition titles.
Day 29 - July 3, 2019: Finished the 7 Swiftly Words game app. I got a lot of practice in creating a layout and constraints in code (as opposed to the IB). I finished the challeneges, which included a pop-up when a wrong answer is submitted. I included two buttons, one to clear the current answer, and another to continue with the current letters entered. There are also point removed for wrong answers, which required me to change the criteria for checking if the level was complete. I also worked through Project 9 to learn about Grand Central Dispatch, and added background processes to the Storm Viewer and Whitehouse Petitions apps as part of the challenges.
Day 30 - July 4, 2019: I finished up the challenges from Project 9 on Grand Central Dispatch by loading the levels in "7 Swiftly Words" in the background and filtering the petitions in "Whitehouse Petitions" in the background. I began work on Project 10 "Names to Faces." I have not progressed very far, but I have created a custom class for the cell of the view controller.
Day 31 - July 5, 2019: I finished the "Names to Faces" app. It allows the user to load photos from the photo library or take a new photo with the camera. The label can then be changed or the image deleted by tapping on the photo. The camera functionality is not shown here because it isn't available on the simulator, though I tested it on my iPhone. If the camera is available, then an alert controller pops up when the "+" button is tapped asking the user if they want to take a new photo or load from the photo library.
Day 32 - July 6, 2019: I began the pachinko game app. I have set up the app and learned how to add
SKSpriteNode objects and have them act according to accurate physics. I also used an
SKAction to have the glows at the bottom rotate constantly.
Day 33 - July 7, 2019: We further learned about how to read collisions and add animations. I finished the challenges which included a few new game features, using the skills learned yesterday. As a part of project 12, I used NSCoding to add data persistence to save photos and names.
Day 34 - July 8, 2019: I added data persistence to "Names to Faces" (10b) using
Codable (project 10a used
NSCoding). The app now also properly deletes the actual image files when the image is removed from the
Day 35 - July 9, 2019: I worked on the Plant Tracker app for my hour of Swift today (much more than just one hour). See the app at this repository.
Day 36 - July 10, 2019: I continued working on the Plant Tracker app. I actually accomplished a lot including implementing and reacting to changes in
UITextField objects. I also had to figure out how to save and load data with each new controller.
Day 37 - July 11, 2019: I got a lot of practice making a layout in code - the tutorial created it in the IB, but I found it easier, and more adaptable to build it in
viewDidLoad(). I did run into a problem with showing the label in a
UIButton, but figured it out by setting the
UIButton(.roundedRect) I got a refresher on loading images from the library. Finally, I learned about the basics of Core Images.
Day 38 - July 12, 2019: I looked at a few CocoaPod libraries, namely SnapKit and ParallaxHeader. I also finished up the Instafilter app, just a few odds and ends, namely to save the adjusted image. I started the Whack-a-Penguin game. The general set up is ready. We will be using cropping masks to hide the penguins, though I'm still not confident in what that means. I will have to experiment a little to become more comfortable with them.
Day 39 - July 13, 2019: I completed the "Whack-a-Penguin" app, except for the challenges at the end of the section. I learned a few more methods available for
SKActions and how to think about the gameplay. I have also read a few posts on a blog about best practices in iOS development, includeing Passing Data Between View Controllers in iOS: The Definitive Guide. It was really interesting and useful.
Day 40 - July 14, 2019: I completed the simple app and the challenges meant to teach me how to use Core Animations. The challenges, to go back to older projects and insert animations, were useful because I had to think about where to put the animations such that they would be logical and stable.
Day 41 - July 15, 2019: It was a pretty simple project that taught me about MapKit. I learned about how to add pins and modify their pop-ups when tapped, including adding text and buttons (along with their selector functions). I also modified the pin colors to be randomly chosen. There is a navigation button to change the type of map view. I also started a fresh game Xcode project for the next game app project, "Space Race".
Day 42 - July 16, 2019: I finished the Space Race game. I learned a bit more about SpriteKit, and got some good practice dealing with touches as I tried to implement a few new features on my own. Overall, a pretty simple app that demonstrates the power of SpriteKit.
Day 43 - July 17, 2019: I learned about using
Day 45 - July 19, 2019: I finished the Fireworks Night app. It's pretty simple, but I was able to learn more about the logic used when creating a game and using SpriteKit.
Day 46 - July 20, 2019: I finished project 21, an introduction to sending and responding to local notifications.
Day 47 - July 21, 2019: I worked on the Plant Tracker app. I restarted the constraints by implementing them in code rather than the IB; I found using
SnapKit much easier!
Day 48 - July 22, 2019: I learned how to detect and react to an iBeacon. I also started the next project, a game called Swifty Ninja. I set up the app and created the first few functions. Nothing much to show except for the blank playing view.
Day 49 - July 23, 2019: I finished the standard gameplay of Swifty Ninja. I learned a lot about the logic used to design a game including how to keep track of all the nodes, removing those out of the frame. Also, I learned how to create a path using
Day 50 - July 24, 2019: I completed 2 of the 3 challenges in the end of the Swifty Ninja project. The first was to remove absolute frame values with those that adjust to the frame of the device. The second was to show a Game Over label. I also completed the playground to learn about strings and
Day 51 - July 25, 2019: I created an app that loads images from the Photos library and shares them to all connected devices. In the example, I create a network between the iOS Simulator and my iPhone 6S, using the iPhone as the host. I then load an image from the library, and it instantly appears on the simulator. The same can be done in other direction, too.
Day 52 - July 26, 2019: I worked on the Plant Tracker app again today. I made good progress on the the library detail view controller, finally getting a simple, understandable, stable, and predictable sticky header with parallax, zoom, and a blur effect.
Day 53 - July 27, 2109: I continued working on the Plant Tracker app for a few hours today. I was able to add in the three information views to the detail view controller for the Library tab. After fixing a few constraints and the size of the main scroll view's content, the scrolling of the main scroll view and the subview tables was intuitive and satistfactory.
I finished two of the three challenges for the Selfie Share app (the third was much more invovled than I really desired). The first challenge was to display an alert when someone disconnects: this was implemented in the switch-case statement in
session(:peer:didChange). The second challenge was to add a button to display all phones connected to the session: if there were multiple connected peers, an additional button was available in the
+ alert controller that would present another alert with effectively the following expression
Day 54 - July 28, 2019: I worked on the Plant Tracker app for a few hours in the morning and was able to add a third-party segmented controller to replace the UIKit standard one. I also added the information to the general information table view subview in the detail controller.
Day 55 - July 29, 2019: I started the Marble Maze game app. I have completed most of the set-up including loading level one, adding physics bodies to all neccesary components, and a player that can roll around in response to touch on the simulator or tilt on an iPad. I got a quick introduction to
Day 56 - July 30, 2019: I continued working on the Plant Traker before work. I got the keyboard interface with the Notes section working. Any text entered into the Notes is now saved to the
Plant instance and all of data is saved when the user navigates back to the Library view controller.
Day 57 - July 31, 2019: I continued working on the Plant Tracker before work. I added the image picker last night and and image viewer this morning. The user can also delete the plant from the library within the detail view controller.
Day 58 - August 1, 2019: More work on the app including adding options to the iOS Settings app and accessing the values in the app. I also added some asynchronous tasks for handling images and files in the background.
Day 59 - August 2, 2019: Instead of doing any coding in the morning, I worked through the RxSwift playground tutorial. I have a better understanding of Rx and the general workflow. The next step will be to see it in action in an example app and try to use it in my Plant Tracker app.
Day 60 - August 3, 2019: I continued work on the Plant Tracker iOS app. There were a bunch of background fixes dealing with saving and loading images and asynchronous processing. I also implemented a paging image viewer.
Day 61 - August 4, 2019: I did a whole bunch on the Plant Tracker iOS app. The main success of the day was refactoring how I saved images as they were being selected. It was a lot more work, but the app is much smoother, faster, and more stable now, so it was definitely worth it. I also added an icon image to the Library tab and a new UI feature to the Header in the Library detail view controller.
Day 62 - August 5, 2019: I made a custom transition in the Plant Tracker app. It zooms into an image held in a collection view cell. It's pretty rudimentary, but I learned the basics of transitions in iOS.
Day 63 - August 6, 2019: Spent 3 hours this morning on trying to understand how to implement the transition that I want. I still have a ways to go, but I'm still learning.
Day 64 - August 7, 2019: Still working on the cutom transition animations. I started a new iOS app where I can fully develop the system without breaking the Plant Tracker and without all of the other stuff in the way. I am fully documenting the entire system. Here is a link to that repository: PhotoZoomAnimator.
Day 65 - August 8, 2019: I finally finished the zoom animation for the transition in the PhotoZoomAnimator app. I spent the first 1.5 hours of the morning finishing up my thorough documentation of the system. I merged the PR to
master on the git repo, PhotoZoomAnimator.
Day 66 - August 9, 2019: I finished the interactive transtion that mimics the Photos app in iOS. It is fully document and explained in the repository.
Day 67 - August 10, 2019: I implemented the interactive zoom transition from the PhotoZoomAnimator test app this morning - it worked flawlessly from the start! I finally returned to the Marble Maze game. I finished up the standard portion of the tutorial to react to the collision of two nodes. The first task was to figure out which was the marble and then react to what the other one was (eg. if the other node is a star, the score increments by one).
Day 68 - August 11, 2019: I refactored the Plant Tracker App a lot (!). While splitting up some bloated "Massive View Controllers", I got a lot of practice in handling segues and delegates. I also made some custom view subclasses, giving me great practive in using MVC.
Day 69 - August 12, 2019: I finished the core portion of Project 27 on drawing with Core Graphics. It was interesting to see how I could program in specific shapes and designs using Core Graphics. I also spent an hour in the afternoon learning about and using Unified Logging to add some logging to a few view controllers of Plant Tracker.
Day 70 - August 13, 2019: I started Project 28 Secret Swift. The base project was to create a secret text view that stored the text in Keychain. Only through biometric identifiaction (either Face ID or Touch ID) could the text be read. Another important feature was to ensure that the text was hidden if the app was navigated away from. For the Challenges, I added a "Done" button to hide the secret text when tapped. I also added a password system for when biometric identification is not available.
Day 71 - August 14, 2019: The base app in Project 30 was a simple table view app with circular icons in each cell. When tapped, a detail view controller loaded with the full (massive) images and recorded the number of times it was tapped on. It was a very slow app - for many reasons - so we used Time Profiler and Acllocations in the Instruments in Xcode.
Day 72 - August 15, 2019: I attended my first Learn Swift Boston meet-up where we learned about Core Data (forked repo). I had a great time and we went through a great tutorial. Tomorroe, I will work through the tutorial on my own.
Day 73 - August 16, 2019: I worked through the addition of Core Data to the base app from last night's Core Data tutorial at Learn Swift Boston.
Day 74 - August 17, 2019: I add a bunch of features to the paging image view in the Plant Tracker app. I got plenty of practice using the delegate method! I also implemented the
UIActivityViewController to share images.
Day 75 - August 18, 2019: I add even more features to the image collection view in the Plant Tracker app. I first had to do some refactoring - always good practice in app framework architecture! I also learned how to enter a multi-select system in a collection view and implemented it in the image collection view to share or delete multiple images at time.
Day 76 - August 19, 2019: We created a
UIStackView and added the ability to add arranged views (not subviews!!). We made these
WKWebViews and let the user select one to change the URL.
Day 77 - August 20, 2019: We finished up the Multibrowser app by adding a way to delete views. I also learned about how the split-screen system works for iPad and we implemented a feature that splits the web views vertically when the iPad view is "compact."
Day 78 - August 21, 2019: Debugged the Plant Tracker app and started adding a way to change the information of the plant.
Day 79 - August 22, 2019: I completed by hour of Swift at the Swift Coders meet-up at Rightpoint this evening. I got help from Leo on how to alter my app's architecture to be more logical, stable, and safe. I will implement the changes soon.
Day 80 - August 27, 2019: I refactored the Plant Tracker app to have a PlantManager object that controls the array of plants. The tasks of loading and saving the plants is now handled by this object instead of a view controller.
Day 81 - September 7, 2019: (After a vacation to celebrate my grandmother's 90th birthday, I have returned, and) I refactored a part of the Plant Tracker app. Specifically, I created a new subclass of
UITableViewController to control the general information table view in the Library's detail view. This is will make editing the information much easier and reduce clutter.
Day 82 - September 8, 2019: I continued working on the Plant Tracker app. While I was at it, I continued refactoring the detail view controller by removing all table view delegate and data source responsibilities. I also started work on the dynamic addition and removal of cell to the general information table view that will be used to all for editing of the information. I was able to mimic the smooth and simultaneous row removal and insertion that Overcast uses by calling
tableView.performBatchUpdates(_ updates: (() -> Void)?, compl etion: ((Bool) -> Void)? = nil). This may be worth writing a post for the website about.
Day 83 - September 9, 2019: I was able to finish the logic behind inserting a row below the one that is tapped and wiring it to the plant-level editing manager. It took a bit of though and experimentation, but I now have a functional "drop-down-menu" looking feature that presents a multi-selecting segmented controller!
Day 84 - September 10, 2019: Today's goal was to finish up the control portion of the plant property editing system. I think I have all of the delegates and functions set up, but there is a problem with the order of operations. Still, I'm getting plenty of practice with control flow and controller architecture!
Day 85 - September 11, 2019: I'm still struggling through the editing of a multi-selection segmented controller that drops down within a
UITableView. I'm almost there, but I may need to do a second iteration given all I have learned during the process. I may also want to make a demonstration app like I did for the zoom animator.
Day 86 - September 12, 2019: I changed around how the plant property editing system worked, mainly off-loading more work to the editing-manager object (instead of the table view controller dealing with it). I also attended Cocoa Heads Boston for the first time. There were three great presentations: 1) using RIBs architecture for scalable app development, 2) including accessiblity in apps for universal design, 3) Zev presented his new app Unicycle.
Day 87 - September 13, 2019: I watched and took notes on the WWDC 2016 tutorial on using unified logging and activity tracing, "Unified Logging and Activity Tracing".
Day 88 - September 14, 2019: I watched and took notes on the WWDC 2016 tutorial on unified logging and activity tracing. I learned a lot about how to use the Console app more productively. Also, how Apple recommends developers code the logging system is different to how I currently use it in the Plant Tracker app. Therefore, I will need to ask someone more experienced for the advice.
Day 89 - September 16, 2019: I finished the system for editing the attributes of a plant that have pre-defined levels. There was one last weird UI bug that I was able to solve. Now, I just need to write up the documentation for Leo so he can take a look at the system I implemented.
Day 90 - September 17, 2019: I finished the explanation for Leo about how I implemented the editing row feature for the general plant information table view. This was a good way for me to review my own code.
Day 91 - September 18, 2019: I am back to Hacking with Swift after some time away, picking up where I left off with Project 32, "Swift Searcher." We started the app by making a standard table view. However, we set the cells to be self-adjusting to fit the entire text for the cell's label. We all used
NSAttributedStrings to make the cell titles look better.
Day 92 - September 19, 2019: I attended my second Learn Swift Boston meetup tonight. The theme was "Zero to App" so we built an app that shows the decibel level reading from the microphone. I learned a lot of useful iOS information, but some of the most valuable lessons were learnt from watching Zev and Sean code in real time.
Day 93 - September 20, 2019: I began work on a simple app to help me track the germination of my seeds. This will just be a simple app for my personal use. I actually planned out how the framework of the app before beginning and made a suprising amount of progress for a few minutes of actual coding. This was a great demonstration of how much I have learned thus far.
Day 94 - September 21, 2019: I continued work on the germination tracker app and mainly just struggled with setting up the detail view controller for the app. It's been awhile since I've had to interact (fight) with
UIScrollView, so this is good practice.
Day 95 - September 22, 2019: Still working on the Germination Tracker app. I added a bunch of functionalities today to allow the user to change all of the information of the seeds. To change the date, I used a modally-presented view controller with a date picker and "Enter" and "Cancel" buttons. The number of seeds sown property is adjusted with an alert with a text field; the text is then parsed for integers and stored to the plant. I am still running into a few problems with the scroll view, but that's expected.
Day 96 - September 23, 2019: I made great progress on embedding view controllers to in other view controllers. I made the notes section for the Germination Tracker a table view with custom cells. I am currently working on the interface for adding a new note. I have the rough draft for the view and ran into a snag on getting it to present. It's great practice, though.
Day 97 - September 24, 2019: I did a bunch of work on the Germination App which included adding swipe-to-delete/insert/copy in the Garden table view, a better UI for the date picker in the information view, a chart for the germination rate (proof-of-concept at the moment) using the 'Chart' package, and swipe to delete in the notes section (need to fix issue with parent scroll view to make this work reliably).
Day 98 - September 25, 2019: I got a lot of practice using dates and the
Calendar API in Foundation. I had to extract time intervals in convert from
Double in order to plot the germination rate line plot in the Germination Tracker app.
Day 99 - September 26, 2019: I spent a few hours at RightPoint in Boston for the monthly SwiftCoders meetup. I had a great time and learned a lot from Kevin, an iOS developer at Chewey. I was able to get his help on a lot of the bugs that were in my Germination Tracker app.
Day 100 - September 27, 2019: I worked on the layout of the information view controller. It's comming along, but seeing how difficult it is to satisfy every constraint conflict, I may try to switch to a XIB, instead.