Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Value Types in WWDC16

Value Types in WWDC16

#wwdc16_meetup

Shinichi Goto

June 30, 2016
Tweet

More Decks by Shinichi Goto

Other Decks in Technology

Transcript

  1. Value Types͔ΒݟΔWWDC16
    ɹ
    WWDC16. Meetup @Wantedly with ೔ܦ৽ฉࣾ
    2016/06/30
    @shingt iOS / Rails Engineer @ Wantedly, Inc.

    View Slide

  2. Value Types

    View Slide

  3. WWDC 2016
    → Protocol and Value Oriented Programming in UIKit
    Apps
    → What's New in Foundation for Swift
    → Understanding Swift Performance

    View Slide

  4. Agenda
    * MVCΞϓϦέʔγϣϯʹ͓͚ΔValue Types
    * `Protocol and Value Oriented Programming in
    UIKit Apps` ΑΓ
    * Swift 3Ͱ௥Ճ͞ΕΔFoundation಺ͷValue Typesʹ͍ͭͯ
    * `What's New in Foundation for Swift` ΑΓ

    View Slide

  5. MVCΞϓϦέʔγϣϯʹ͓͚ΔValue Types

    View Slide

  6. WWDC 2015
    → Protocol-Oriented Programming in Swift
    → Building Better Apps with Value Types in Swift

    View Slide

  7. WWDC 2016
    Protocol and Value Oriented Programming in UIKit
    Apps

    View Slide

  8. Value Types in MVC-based Application
    * Model => ʢ࢖͑Δ৔ॴͰʣ࢖ͬͯ౰વʢUncontroversialʣ
    * View => ?ɹ
    * Controller => ? ɹ

    View Slide

  9. Value Types in MVC-based Application
    * Model => ʢ࢖͑Δ৔ॴͰʣ࢖ͬͯ౰વʢUncontroversialʣ
    * View
    * StructͰͷϨΠΞ΢τॲཧ <= ࠓ೔঺հ͠·͢
    * ΄͔
    * Controller => ? ɹ

    View Slide

  10. https://developer.apple.com/library/prerelease/
    content/LucidDreams

    View Slide

  11. View Slide

  12. View Slide

  13. class DecoratingLayoutCell : UITableViewCell {
    var content: UIView
    var decoration: UIView
    }
    // => UIViewʹ͸ద༻Ͱ͖ͳ͍

    View Slide

  14. // CellͱUIViewͷͲͪΒʹ΋ద༻Ͱ͖ΔܗͰఆٛ
    struct DecoratingLayout {
    var content: UIView
    var decoration: UIView
    mutating func layout(in rect: CGRect) {
    content.frame = ...
    decoration.frame = ...
    }
    }

    View Slide

  15. class DreamCell : UITableViewCell {
    override func layoutSubviews() {
    // DecoratingLayoutʹΑΓlayout
    var decoratingLayout = DecoratingLayout(
    content: content, decoration: decoration)
    decoratingLayout.layout(in: bounds)
    }
    }

    View Slide

  16. View Slide

  17. struct DecoratingLayout {
    // contentͱdecorationΛಉ͡ܕʹ͢ΔͨΊͷ੍໿ΛGenericsͰ
    var content: Child
    var decoration: Child
    mutating func layout(in rect: CGRect) {
    content.frame = ...
    decoration.frame = ...
    }
    }
    protocol Layout {
    var frame: CGRect { get set }
    }
    extension UIView : Layout {...}
    extension SKNode : Layout {...}

    View Slide

  18. View Slide

  19. ViewΛ૊Έ߹ΘͤΔʁ

    View Slide

  20. Composition of Views
    "Minimize the number of views that we use."ɹɹ
    ʢViewͷੜ੒͸ίετߴͳͷͰʣ
    => Composition of Values

    View Slide

  21. Composition of values

    View Slide

  22. Composition of values
    struct CascadingLayout {
    // Layoutʹద߹ͨ͠ܕͷ഑ྻ
    var children: [Child]
    mutating func layout(in rect: CGRect) {...}
    }

    View Slide

  23. struct MultiPaneLayout: Layout {
    mutating func layout(in rect: CGRect) {
    // CascadingLayoutͱDecoratingLayoutΛ૊Έ߹ΘͤΔ
    let decoration = CascadingLayout(children: accessories)
    var composedLayout = DecoratingLayout(
    content: content, decoration: decoration)
    // ࠷ऴతͳϨΠΞ΢τॲཧ
    composedLayout.layout(in: rect)
    }
    }

    View Slide

  24. ηογϣϯͰ͸͜͜·Ͱ
    => αϯϓϧίʔυΛ೷͘ͱ

    View Slide

  25. View Slide

  26. ؆қ·ͱΊ
    * Viewɹ
    * StructΛ࢖ͬͨϨΠΞ΢τॲཧ
    * Value TypesʹΑΔComposition
    * Controllerʢলུʣ
    * Single code pathɹ
    * EnumͰͷঢ়ଶ؅ཧ
    * શମͱͯ͠Local Reasoningʢہॴਪ࿦ʣՄೳͳίʔυ

    View Slide

  27. Swift 3Ͱ௥Ճ͞ΕΔFoundation಺ͷ
    Value Typesʹ͍ͭͯ

    View Slide

  28. → What's New in Foundation for Swift

    View Slide

  29. 0069-swift-mutability-for-foundation.md

    View Slide

  30. Swift 3ͰͷFoundationͷมԽ
    * FoundationͷҰ෦ͷReference TypesΛϥοϓ͢ΔValue Types͕௥Ճ
    * ྫ: NSDate => Date
    * "mutability when you need it"ɹ
    * ඪ४ϥΠϒϥϦͷprotocol΁ͷ४ڌ
    * ྫ: Equatable, Comparable, ...
    * ܕηʔϑͷՕॴ͕૿͑Δ
    * NSϓϨϑΟΫε͕औΕΔʢ͜Ε͸ผͷproposalʣ

    View Slide

  31. Ұ෦

    View Slide

  32. ྫ: Date
    public struct Date :
    ReferenceConvertible,
    Comparable,
    Equatable,
    CustomStringConvertible {
    ...
    }
    // Comparable
    public func Bool {
    return lhs.timeIntervalSinceReferenceDate
    < rhs.timeIntervalSinceReferenceDate
    }

    View Slide

  33. func whenToLeave() -> Date { ... }
    let when = whenToLeave().addingTimeInterval(-5.0 * 60.0)
    // Comparableʹ४ڌ͍ͯ͠ΔͨΊ
    if Date() < when {
    // Կؾʹselectorແ͠Ͱهड़Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔTimer
    timer = Timer(fireDate: when, interval: 0, repeats: false) {
    print("Almost time to go!")
    }
    RunLoop.main.add(timer, forMode: .commonModes)
    }

    View Slide

  34. ηογϣϯதͷଞͷ࿩୊
    * ͦͷଞͷ֤छAPIͷมߋ಺༰
    * SwiftͱObjective-CؒͷBridging
    * Swift 3༻API΁ͷMigration

    View Slide

  35. ͱ͜ΖͰValue Types͸
    * ͲͷΑ͏ͳ࣌ʹར༻͢΂͖ͳͷ͔ʁ
    * ͦͷ࣌ͳͥύϑΥʔϚϯε͕ྑ͍ͷ͔ʁ

    View Slide

  36. → Understanding Swift Performance (WWDC 16)
    → Optimizing Swift Performance (WWDC 15)
    * Memory allocation
    * Reference counting
    * Method dispatch
    ͳͲͷ؍఺͔Β಺෦࣮૷΋ަ͑ͯղઆ

    View Slide

  37. Summary
    * WWDC 16ͰͷValue Typesʹؔͯ͠ͷ࿩୊Λ঺հ͠·ͨ͠
    * MVCΞϓϦέʔγϣϯʹ͓͚ΔValue Typesͷར༻
    * StructͷCompositionͰLayoutΛදݱ͢Δྫͷ঺հ
    * Swift 3Ͱ௥Ճ͞ΕΔFoundation಺ͷValue Typesʹ͍ͭͯ
    * Dateͷྫͷ঺հ

    View Slide

  38. Reference
    * Value and Reference Types - Swift Developer Blog
    * https://developer.apple.com/swift/blog/?id=10
    * WWDC 15
    * Building Better Apps with Value Types in Swift
    * https://developer.apple.com/videos/play/wwdc2015/414/
    * Protocol-Oriented Programming in Swift
    * https://developer.apple.com/videos/wwdc/2015/408/
    * Optimizing Swift Performance
    * https://developer.apple.com/videos/play/wwdc2015/409/
    * WWDC 16
    * Protocol and Value Oriented Programming in UIKit Apps
    * https://developer.apple.com/videos/play/wwdc2016/419/
    * What's New in Foundation for Swift
    * https://developer.apple.com/videos/play/wwdc2016/207/
    * Understanding Swift Performance
    * https://developer.apple.com/videos/play/wwdc2016/416/
    * https://github.com/apple/swift-corelibs-foundation

    View Slide