AltConf 2015: Swift Thinking

44
Swift Thinking @NatashaTheRobot

Transcript of AltConf 2015: Swift Thinking

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”

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