Xcode 12.4. App supports iOS 13+, however I mainly tested on iOS 14.4. You may need to cd into the project structure and run pod install in order to download the CocoaPod dependency.
- MVVM
- This allows for a highly testable and scalable app which can be tested. All UI code is kept to the View Controllers, and data is held and managed in the ViewModel or elsewhere.
- Clean / Minimalistic code with comments where necessary
- Extremely high code coverage (>90%)
- Dependency Injection, Mocked JSON files to properly write unit tests without relying on a network
- A good example of this is in the
Networkingclass and associated test file. By doing this, we avoid relying on an active network - and a result having flaky tests.
- UI created programmatically
- I adopted a non-storyboard approach since I find it is much better for PR reviews and readability.
- Support for portrait and landscape modes
- Accessibility - readouts are clear and localized
- Accessibility bugs can have legal repercussions, so it is extremely important to the app is ADA complaint and has clear readouts
- Supports dynamic font sizes! (Check screenshots below)
- Localization (english / spanish support for now)
- Automatic image caching with UIImageView subclass
- I subclassed
UIImageViewand have our subclassed image view interact with our Networking and Caching layer. This will prevent multiple networking calls from firing off for the same asset.
- Code layering (Networking, Caching, Employees Service, UI) all within its own distinct areas and easy to maintain / scale for more functionality
- Every class has a distinct and direct purpose. If multiple areas of functionality are required, then an object reference will be passed accordingly where needed.
- Low Memory Handling - the caching layer will wipe data in this case
- TDD - smaller commits targeting certain "layers" with associated tests
None, other than SwiftProtobuf 1.0 via CocoaPods. UI inspired (but heavily adapted for this project) by previous personal projects and tutorials.
Phone focus - tested both notched and non-notched devices.
About 5 hours over the course of a day.
- While I did not have to use Protocol Buffers, I was aware the company uses them extensively - so I implemented it for the
Employee/Employeesmodel (also to improve performance) - Since there are no UI tests now, accessibility specific ones have not been created
- Building upon networking layer, implementing POST, PATCH, DELETE, etc..
- Abstracting out caching later to support more than <NSString, NSData> types
- Core Data if persistent storage was a requirement in the future
- Integration / Snapshot tests
- Analytics
- Support for more locales (right now only english/spanish)
- SwiftUI
- Better UI support for slow connectivity edge case (i.e "Still Loading..." alert/pop-up after a few seconds)
- More testing mocks (i.e for EmployeeListViewModel in CachedImageViewTests) - this would allow for greater scalability/flexibility in the future
- Better UITableViewCell constraints for edge cases
- If dynamic font size text is super big the employee cell should not waste any space at the top or bottom
- Profile image view should scale up/down slightly while maintaining 1:1 aspect ratio
Normal Dynamic Font Size
Large Dynamic Font Size


