Paul Hudson's 100 Days of Swift challenge -> https://www.hackingwithswift.com/100
- Day 1
- Variables..
- Strings and integers.
- Multi-line strings.
- Doubles and booleans.
- String interpolation.
- Constants.
- Type annotations.
- Simple types: Summary.
- Day 2
- Arrays.
- Sets.
- Tuples.
- Arrays vs sets vs tuples.
- Dictionaries.
- Dictionary default values.
- Creating empty collections.
- Enumerations.
- Enum associated values.
- Enum raw values.
- Complex types: Summary.
- Day 3
- Arithmetic Operators.
- Operator overloading.
- Compound assignment operators.
- Comparison operators.
- Conditions.
- Combining conditions.
- The ternary operator.
- Switch statements.
- Range operators.
- Operators and conditions summary.
- Day 4
- For loops.
- While loops.
- Repeat loops.
- Exiting loops.
- Exiting multiple.
- Skipping items.
- Infinite loops.
- Looping summary.
- Day 5
- Writing functions.
- Accepting parameters.
- Returning values.
- Parameter labels.
- Omitting parameter labels.
- Default parameters.
- Variadic functions.
- Writing throwing functions.
- Running throwing functions.
- inout parameters.
- Functions summary.
- Day 6
- Creating basic closures
- Accepting parameters in a closure
- Returning values from a closure
- Closures as parameters
- Trailing closure syntax
- Day 7
- Using closures as parameters when they accept parameters
- Using closures as parameters when they return values
- Shorthand parameter names
- Closures with multiple parameters
- Returning closures from functions
- Capturing values
- Closures summary
- Day 8
- Creating your own structs
- Computed properties
- Property observers
- Methods
- Mutating methods
- Properties and methods of strings
- Properties and methods of arrays
- Day 9
- Initializers
- Referring to the current instance
- Lazy properties
- Static properties and methods
- Access control
- Structs summary
- Day 10
- Creating your own classes
- Class inheritance
- Overriding methods
- Final classes
- Copying objects
- Deinitializers
- Mutability
- Classes summary
- Day 11
- Protocols
- Protocol inheritance
- Extensions
- Protocol extensions
- Protocol-oriented programming
- Protocols and extensions summary
- Day 12
- Handling missing data
- Unwrapping optionals
- Unwrapping with guard
- Force unwrapping
- Implicitly unwrapped optionals
- Nil coalescing
- Optional chaining
- Optional try
- Failable initializers
- Typecasting
- Optionals summary
- Day 13
- Variables and constants
- Types of Data
- Operators
- String interpolation
- Arrays
- Dictionaries
- Conditional statements
- Loops
- Switch case
REVIEW DAY
- Day 14
- Functions
- Optionals
- Optional chaining
- Enumerations
- Structs
- Classes
- Day 15
- Properties
- Static properties and methods
- Access control
- Polymorphism and typecasting
- Closures
- Day 16
- Setting up
- Listing images with FileManager
- Designing our interface
- Day 17
- Building a detail screen
- Loading images with UIImage
- Final tweaks: hidesBarsOnTap, safe area margins
- Day 18
- Wrap up
- Review for Project 1: Storm Viewer
- Day 19
- Setting up
- Designing your layout
- Making the basic game work: UIButton and CALayer
- Day 20
- Guess which flag: random numbers
- From outlets to actions: creating an IBAction
- Day 21
- Wrap up
- Review for Project 2: Guess the Flag
- Day 22
- About technique projects
- UIActivityViewController explained
- Wrap up
- Review for Project 3: Social media
- Day 23
- What you learned
- Key points
- Challenge
- Day 24
- Setting up
- Creating a simple browser with WKWebView
- Choosing a website: UIAlertController action sheets
- Day 25
- Monitoring page loads: UIToolbar and UIProgressView
- Refactoring for the win
- Day 26
- Wrap up
- Review for Project 4: Easy Browser
- Day 27
- Capture lists in Swift: what’s the difference between weak, strong, and unowned references?
- Setting up
- Reading from disk: contentsOfFile
- Pick a word, any word: UIAlertController
- Day 28
- Prepare for submission: lowercased() and IndexPath
- Checking for valid answers
- Or else what?
- Day 29
- Wrap up
- Review for Project 5: Word Scramble
- Day 30
- Setting up
- Advanced Auto Layout
- Auto Layout in code: addConstraints() with Visual Format Language
- Day 31
- Auto Layout metrics and priorities: constraints(withVisualFormat:)
- Auto Layout anchors
- Wrap up
- Review for Project 6: Auto Layout
- Day 32
- What you learned
- Key points
- Challenge
- Day 33
- Setting up
- Creating the basic UI: UITabBarController
- Parsing JSON using the Codable protocol
- Day 34
- Rendering a petition: loadHTMLString
- Finishing touches: didFinishLaunchingWithOptions
- Day 35
- Wrap up
- Review for Project 7: Whitehouse Petitions
- Day 36
- Setting up
- Building a UIKit user interface programmatically
- Day 37
- Loading a level and adding button targets
- It's play time: firstIndex(of:) and joined()
- Property observers: didSet
- Day 38
- Wrap up
- Review for Project 8: 7 Swifty Words
- Day 39
- Setting up
- Why is locking the UI bad?
- GCD 101: async()
- Back to the main thread: DispatchQueue.main
- Easy GCD using performSelector(inBackground:)
- Day 40
- Wrap up
- Review for Project 9: Grand Central Dispatch
- Day 41
- What you learned
- Key points
- Challenge
- Day 42
- Setting up
- Designing UICollectionView cells
- UICollectionView data sources
- Day 43
- Importing photos with UIImagePickerController
- Custom subclasses of NSObject
- Connecting up the people
- Day 44
- Wrap up
- Review for Project 10: Grand Central Dispatch
- Day 45
- Setting up
- Falling boxes: SKSpriteNode, UITouch, SKPhysicsBody
- Bouncing balls: circleOfRadius
- Day 46
- Spinning slots: SKAction
- Collision detection: SKPhysicsContactDelegate
- Scores on the board: SKLabelNode
- Day 47
- Special effects: SKEmitterNode
- Wrap up
- Review for Project 11: Pachinko
- Day 48
- Setting up
- Reading and writing basics: UserDefaults
- Fixing Project 10: NSCoding
- Day 49
- Fixing Project 10: Codable
- Wrap up
- Review for Project 12: UserDefaults
- Day 50
- What you learned
- Key points
- Challenge
- Day 51
- Elements of Functional Programming
- Teaching Swift at Scale
- Day 52
- Setting up
- Designing the interface
- Importing a picture
- Day 53
- Applying filters: CIContext, CIFilter
- Saving to the iOS photo library
- Day 54
- Wrap up
- Review for Project 13: Instafilter
- Day 55
- Setting up
- Getting up and running: SKCropNode
- Penguin, show thyself: SKAction moveBy(x:y:duration:)
- Day 56
- Whack to win: SKAction sequences
- Wrap up
- Review for Project 14: Whack-a-Penguin
- Day 57
- Setting up
- Preparing for action
- Switch, case, animate: animate(withDuration:)
- Transform: CGAffineTransform
- Day 58
- Wrap up
- Review for Project 15: Animation
- Day 59
- What you learned
- Key points
- Challenge
- Day 60
- Setting up
- Up and running with MapKit
- Annotations and accessory views: MKPinAnnotationView
- Day 61
- Wrap up
- Review for Project 16: Capital Cities
- Day 62
- Setting up
- Space: the final frontier
- Bring on the enemies: linearDamping, angularDamping
- Making contact: didBegin()
- Day 63
- Wrap up
- Review for Project 17: Space Race
- Day 64
- Setting up
- Basic Swift debugging using print()
- Debugging with assert()
- Debugging with breakpoints
- View debugging
- Day 65
- Wrap up
- Review for Project 18: Debugging
- Day 66
- What you learned
- Key points
- Challenge
- Day 67
- Setting up
- Making a shell app
- Adding an extension: NSExtensionItem
- What do you want to get?
- Day 68
- Establishing communication
- Editing multiline text with UITextView
- Fixing the keyboard: NotificationCenter
- Day 69
- Wrap up
- Review for Project 19: JavaScript Injection
- Day 70
- Setting up
- Ready... aim... fire: Timer and follow()
- Swipe to select
- Day 71
- Making things go bang: SKEmitterNode
- Wrap up
- Review for Project 20: Fireworks Night
- Day 72
- Setting up
- Scheduling notifications: UNUserNotificationCenter and UNNotificationRequest
- Acting on responses
- Day 73
- Wrap up
- Review for Project 21: Local Notifications
- Day 74
- What you learned
- Key points
- Challenge
- Day 75
- Setting up
- Requesting location: Core Location
- Hunting the beacon: CLBeaconRegion
- Day 76
- Wrap up
- Review for Project 22: Detect-a-Beacon
- Day 77
- Setting up
- Basics quick start: SKShapeNode
- Shaping up for action: CGPath and UIBezierPath
- Enemy or bomb: AVAudioPlayer
- Day 78
- Follow the sequence
- Slice to win
- Game over, man: SKTexture
- Day 79
- Wrap up
- Review for Project 23: Swifty Ninja
- Day 80
- Setting up
- Strings are not arrays
- Working with strings in Swift
- Formatting strings with NSAttributedString
- Day 81
- Wrap up
- Review for Project 24: Swift Strings
- Day 82
- What you learned
- Key points
- Challenge
- Day 83
- Setting up
- Importing photos again
- Going peer to peer: MCSession, MCBrowserViewController
- Invitation only: MCPeerID
- Day 84
- Wrap up
- Review for Project 25: Selfie Share
- Day 85
- Setting up
- Loading a level: categoryBitMask, collisionBitMask, contactTestBitMask
- Day 86
- Tilt to move: CMMotionManager
- Contacting but not colliding
- Day 87
- Wrap up
- Review for Project 26: Marble Maze
- Day 88
- Setting up
- Creating the sandbox
- Drawing into a Core Graphics context with UIGraphicsImageRenderer
- Ellipses and checkerboards
- Transforms and lines
- Images and text
- Day 89
- Wrap up
- Review for Project 27: Core Graphics
- Day 90
- What you learned
- Key points
- Challenge
- Day 91
- Day 92
- Setting up
- The basic text editor
- Writing somewhere safe: the iOS keychain
- Touch to activate: Touch ID, Face ID and LocalAuthentication
- Day 93
- Wrap up
- Review for Project 28: Secret Swift
- Day 94
- Setting up
- Building the environment: SKTexture and filling a path
- Mixing UIKit and SpriteKit: UISlider and SKView
- Day 95
- Unleash the bananas: SpriteKit texture atlases
- Destructible terrain: presentScene
- Day 96
- Wrap up
- Review for Project 29: Exploding Monkeys
- Day 97
- Setting up
- What are we working with?
- What can Instruments tell us?
- Fixing the bugs: slow shadows
- Fixing the bugs: wasted allocations
- Day 98
- Fixing the bugs: Running out of memory
- Wrap up
- Review for Project 30: Instruments
- Day 99
- What you learned
- Key points
- Challenge
- Day 100
- DONE! 99/100 exam score!!