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

20191206 Property Wrappers 入門

Kei Ito
December 06, 2019

20191206 Property Wrappers 入門

Kei Ito

December 06, 2019
Tweet

More Decks by Kei Ito

Other Decks in Programming

Transcript

  1. 1SPQFSUZ8SBQQFST
    ೖ໳
    .PCJMF"DU04","
    JUPL!ͦΒ͔ͥ

    View Slide

  2. JUPL!ͦΒ͔ͥ
    w ͍ͱ͏͚͍ʢJUPLʣ
    w ɹɹɹɹɹɹͷதͷਓ
    w ϞόΠϧΞϓϦΤϯδχΞ݉$&0
    w ෭ۀͰϑϦʔϥϯεత
    w IUUQTJUPLKQ IUUQTTPSBLB[FDPKQ !JUPLKQ

    View Slide

  3. ॴࡏ஍ɿژ౎ࢢதژ۠
    ࣾһਓࣗ෼

    View Slide

  4. ࣮੷
    डୗ
    ࣗࣾ

    View Slide

  5. .PEFSO4XJGU"1*%FTJHO
    IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

    View Slide

  6. 1SPQFSUZ8SBQQFST

    View Slide

  7. final class UserData: ObservableObject {
    @Published var showFavoritesOnly = false
    @Published var landmarks = landmarkData
    }
    ͜Ε

    View Slide

  8. 4&
    IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPOCMPCNBTUFS
    QSPQPTBMTQSPQFSUZXSBQQFSTNE
    There are property implementation patterns that come
    up repeatedly. Rather than hardcode a fixed set of
    patterns into the compiler (as we have done for lazy
    and @NSCopying), we should provide a general
    "property wrapper" mechanism to allow these patterns
    to be defined as libraries.

    View Slide

  9. Α͏͢Δʹ
    ϓϩύςΟʹର͢Δڞ௨ͷॲཧΛ
    ͖Ε͍ʹ·ͱΊͯ͠·͍·͠ΐ͏
    ͱ͍͏ػೳ

    View Slide

  10. w 4XJGUҎ߱
    w 4XJGUϥϯλΠϜͰ΋ಈ͖·͢
    w J04Ͱ΋ಈ͖·͢

    View Slide


  11. ʮ஗ԆॳظԽʯ

    View Slide

  12. struct Object {
    @LateInitialized var text: String
    }
    @propertyWrapper
    struct LateInitialized {
    private var storage: T?
    var wrappedValue: T {
    get {
    guard let value = storage else {
    fatalError()
    }
    return value
    }
    set {
    storage = newValue
    }
    }
    }

    View Slide

  13. var obj1 = Object()
    print("\(obj1.text)") // -> fatal error
    var obj2 = Object()
    obj2.text = "hello"
    print("\(obj2.text)") // -> "hello"

    View Slide


  14. ʮ6TFS%FGBVMUTʯ

    View Slide

  15. @propertyWrapper
    struct UserDefault {
    let key: String
    let defaultValue: T
    var wrappedValue: T {
    get {
    return
    (UserDefaults.standard.object(forKey: key) as? T)
    ?? defaultValue
    }
    set {
    UserDefaults.standard.set(newValue, forKey: key)
    }
    }
    }

    View Slide

  16. @UserDefault(key: "initialized", defaultValue: false)
    var initialized: Bool
    @UserDefault(key: "username", defaultValue: "")
    var username: String
    obj.username = "mobile"
    print("\(UserDefaults.standard.string(forKey: "username")!)")
    // -> "mobile"
    UserDefaults.standard.set("act", forKey: "username")
    print("\(obj.username)") // -> "act"

    View Slide

  17. ΋͏গ͠ৄ͘͠

    View Slide

  18. ॻ͖׵͑ϧʔϧ
    @propertyWrapper
    struct WrapperA {}
    @propertyWrapper
    struct WrapperB {}
    // ॳظ஋
    @WrapperA var obj: String = "test"
    ɹ↓
    private var _obj: WrapperA(wrappedValue: "test")
    // ࿈݁Մೳ
    @WrapperA @WrapperB var obj: String
    ɹ↓
    private var _obj: WrapperA>

    View Slide

  19. ېࢭࣄ߲
    w XSBQQFS͖ͭͷQSPQFSUZ͸
    w QSPUPDPM಺Ͱ͸એݴͰ͖ͳ͍
    w FYUFOTJPO಺Ͱ͸એݴͰ͖ͳ͍
    w PWFSSJEFͰ͖ͳ͍
    w TFUUFSHFUUFS͚ͭͯ͸͍͚ͳ͍
    ͳͲ

    View Slide

  20. ࢀߟࢿྉ
    w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZ
    XXED
    w IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPO
    CMPCNBTUFSQSPQPTBMTQSPQFSUZ
    XSBQQFSTNE

    View Slide