Swift Thinking
@NatashaTheRobot
@NatashaTheRobot
• Swift Newsletter -
swiftnews.curated.co
• NatashaTheRobot.com
Learning…
Work with Others
Teach
Put Your Stuff Out
There
Expose Yourself to
Advanced Topics
Celebrate
Breakthroughs
@ashsmash
Learning…
• Value Types
• Optionals?!
• Testing
Value Types
• structs
• enums
• (tuples)
class Person {
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 26
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(person: Person) {
person.age += 1
🎉🎂🎁🎈💥()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 26
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
🎉🎂🎁🎈💥()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 26
struct Person {
let name: String
var age: Int
// NO INIT NEEDED
}
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 25
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
🎉🎂🎁🎈💥()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 25
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
🎉🎂🎁🎈💥()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 25
let taylorSwift = Person(name: "Taylor Swift", age: 25)
func timeTravelToBirthdayForPerson(var person: Person) {
person.age += 1
🎉🎂🎁🎈💥()
}
timeTravelToBirthdayForPerson(taylorSwift)
taylorSwift.age // 25
@andy_matuschak
• Functional Swift Conference: Functioning as a
Functionalist
• Realm: Controlling Complexity in Swift
–Functional Swift Book
“Almost all types in Swift are value types,
including arrays, dictionaries, numbers,
booleans, tuples, and enums. Classes are the
exception rather than the rule.”
$ grep -e "^struct " swift.md | wc -l
87
$ grep -e "^enum " swift.md | wc -l
8
$ grep -e "^class " swift.md | wc -l
4
Optionals?!
–Sunset Lake Software
“~40% of bugs shipped to customers in the last
three years would have been caught
immediately by using Swift”
Objc.io Issue 13
struct Person {
let name: String
var age: Int
}
struct PersonViewModel {
var name: String?
var age: String?
}
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var ageTextField: UITextField!
var personViewModel = PersonViewModel()
override func viewDidLoad() {
super.viewDidLoad()
}
func textFieldDidEndEditing(textField: UITextField) {
personViewModel.name = nameTextField.text
personViewModel.age = ageTextField.text
}
}
struct PersonViewModel {
var name: String?
var age: String?
enum InputError: ErrorType {
case InputMissing
case AgeIncorrect
}
func createPerson() throws -> Person {
guard let age = age, let name = name else {
throw InputError.InputMissing
}
guard let ageFormatted = Int(age) else {
throw InputError.AgeIncorrect
}
return Person(name: name, age: ageFormatted)
}
}
class ViewController: UIViewController, UITextFieldDelegate {
var personViewModel = PersonViewModel()
// ... truncated ... //
@IBAction func onSubmitButtonTap(sender: AnyObject) {
view.endEditing(true)
do {
let person = try personViewModel.createPerson()
print("Success! Person created. (person)")
} catch PersonViewModel.InputError.InputMissing {
print("Input missing!")
} catch PersonViewModel.InputError.AgeIncorrect {
print("Age Incorrect!")
} catch {
print("Something went wrong, please try again!")
}
}
}
Failable initializers, revisited
@jesse_squires
Testing
• Performance Tests
• Asynchronous Tests
• Xcode CI Improvements
• UI Tests
• Code Coverage
Still Learning…
• Value Types
• Optionals?!
• Testing
To Learn…
• do
• guard
• defer
• error handling
• protocol extensions
• print
• pattern matching
• early exits
• UI Testing
• WatchOS
• UIStackView
• Security
• Complications
• Continuous Integration
• App Thinning
• Crash Logs
• Objective-C Generics

AltConf 2015: Swift Thinking

  • 1.
  • 2.
    @NatashaTheRobot • Swift Newsletter- swiftnews.curated.co • NatashaTheRobot.com
  • 3.
  • 4.
  • 5.
  • 6.
    Put Your StuffOut There
  • 7.
  • 8.
  • 9.
  • 10.
    Learning… • Value Types •Optionals?! • Testing
  • 11.
  • 12.
  • 13.
    class Person { letname: String var age: Int init(name: String, age: Int) { self.name = name self.age = age } }
  • 14.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 () } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 26
  • 15.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(person: Person) { person.age += 1 🎉🎂🎁🎈💥() } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 26
  • 16.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 🎉🎂🎁🎈💥() } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 26
  • 17.
    struct Person { letname: String var age: Int // NO INIT NEEDED }
  • 18.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 () } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 25
  • 19.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 🎉🎂🎁🎈💥() } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 25
  • 20.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 🎉🎂🎁🎈💥() } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 25
  • 21.
    let taylorSwift =Person(name: "Taylor Swift", age: 25) func timeTravelToBirthdayForPerson(var person: Person) { person.age += 1 🎉🎂🎁🎈💥() } timeTravelToBirthdayForPerson(taylorSwift) taylorSwift.age // 25
  • 23.
    @andy_matuschak • Functional SwiftConference: Functioning as a Functionalist • Realm: Controlling Complexity in Swift
  • 24.
    –Functional Swift Book “Almostall types in Swift are value types, including arrays, dictionaries, numbers, booleans, tuples, and enums. Classes are the exception rather than the rule.”
  • 25.
    $ grep -e"^struct " swift.md | wc -l 87 $ grep -e "^enum " swift.md | wc -l 8 $ grep -e "^class " swift.md | wc -l 4
  • 26.
  • 28.
    –Sunset Lake Software “~40%of bugs shipped to customers in the last three years would have been caught immediately by using Swift”
  • 29.
  • 31.
    struct Person { letname: String var age: Int }
  • 32.
    struct PersonViewModel { varname: String? var age: String? }
  • 33.
    class ViewController: UIViewController,UITextFieldDelegate { @IBOutlet weak var nameTextField: UITextField! @IBOutlet weak var ageTextField: UITextField! var personViewModel = PersonViewModel() override func viewDidLoad() { super.viewDidLoad() } func textFieldDidEndEditing(textField: UITextField) { personViewModel.name = nameTextField.text personViewModel.age = ageTextField.text } }
  • 34.
    struct PersonViewModel { varname: String? var age: String? enum InputError: ErrorType { case InputMissing case AgeIncorrect } func createPerson() throws -> Person { guard let age = age, let name = name else { throw InputError.InputMissing } guard let ageFormatted = Int(age) else { throw InputError.AgeIncorrect } return Person(name: name, age: ageFormatted) } }
  • 35.
    class ViewController: UIViewController,UITextFieldDelegate { var personViewModel = PersonViewModel() // ... truncated ... // @IBAction func onSubmitButtonTap(sender: AnyObject) { view.endEditing(true) do { let person = try personViewModel.createPerson() print("Success! Person created. (person)") } catch PersonViewModel.InputError.InputMissing { print("Input missing!") } catch PersonViewModel.InputError.AgeIncorrect { print("Age Incorrect!") } catch { print("Something went wrong, please try again!") } } }
  • 36.
  • 37.
  • 38.
    • Performance Tests •Asynchronous Tests • Xcode CI Improvements • UI Tests • Code Coverage
  • 43.
    Still Learning… • ValueTypes • Optionals?! • Testing
  • 44.
    To Learn… • do •guard • defer • error handling • protocol extensions • print • pattern matching • early exits • UI Testing • WatchOS • UIStackView • Security • Complications • Continuous Integration • App Thinning • Crash Logs • Objective-C Generics