Slide 1

Slide 1 text

Property WrapperͰ༡΅͏ 2019/09/11 @ؼ͖ͬͯͨؔ੢ϞόΠϧΞϓϦݚڀձ#3 Yutaro Muta @yutailang0119

Slide 2

Slide 2 text

• Yutaro Muta @yutailang0119 • Hatena Co., Ltd. @Kyoto • Conference Staff • builderscon 2017, 2018, 2019 • try! Swift Tokyo 2019, 2020 • try! Swift Tokyo 2020 νέοτൢച։࢝ • https://www.tryswift.co/events/2020/tokyo/en/ Who am I ?

Slide 3

Slide 3 text

⚠͝஫ҙ • ؀ڥ • macOS Mojave Version 10.14.6 • Xcode 11.0 GM seed (11M419c)

Slide 4

Slide 4 text

Property Wrapper

Slide 5

Slide 5 text

Property Wrapper • https://github.com/apple/swift-evolution/blob/master/proposals/0258-property- wrappers.md • ࠷ॳͷPitch͸Property Delegateͱͯ͠ɺMarch 3, 2019ʹొ৔ • https://forums.swift.org/t/returned-for-revision-se-0258-property-delegates/24080 • Swift 5.1 ~ • ొ৔౰ॳ͸Swift 5.1ʹೖΒͳ͍ͩΖ͏ͱ͍͏ҹ৅͕ͩͬͨɺWWDCͰApple͕ൃදͨ͠ SwiftUIʹ΋࢖༻͞Ε͍ͯΔ • Swift 5.1ͷfinal branching͸March 18, 2019

Slide 6

Slide 6 text

Property Wrapper • https://github.com/apple/swift-evolution/blob/master/proposals/0258-property- wrappers.md • ࠷ॳͷPitch͸Property Delegateͱͯ͠ɺMarch 3, 2019ʹొ৔ • https://forums.swift.org/t/returned-for-revision-se-0258-property-delegates/24080 • Swift 5.1 ~ • ొ৔౰ॳ͸Swift 5.1ʹೖΒͳ͍ͩΖ͏ͱ͍͏ҹ৅͕ͩͬͨɺWWDCͰApple͕ൃදͨ͠ SwiftUIʹ΋࢖༻͞Ε͍ͯΔ • Swift 5.1ͷfinal branching͸March 18, 2019

Slide 7

Slide 7 text

https://github.com/apple/swift-evolution/blob/master/ proposals/0258-property-wrappers.md https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md

Slide 8

Slide 8 text

https://github.com/apple/swift-evolution/blob/master/ proposals/0258-property-wrappers.md https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md

Slide 9

Slide 9 text

OSS SwiftͰ͸࣮૷த

Slide 10

Slide 10 text

࣮૷ঢ়گ • େ࿮͸Ͱ͖͍ͯΔ • https://github.com/apple/swift/pulls?utf8=✓&q=is%3Apr+SE-+0258 • όάใࠂ΋͔ͳΓ͋Δ • https://bugs.swift.org/issues/?jql=labels+%3D+PropertyWrappers

Slide 11

Slide 11 text

BugΛ୳ͦ͏

Slide 12

Slide 12 text

Property WrapperͷΑ͋͘Δྫ

Slide 13

Slide 13 text

Property Wrapper x UserDefaults

Slide 14

Slide 14 text

Property Wrapper x UserDefaults • [WWDC 2019] What's New in Swift • https://developer.apple.com/videos/play/wwdc2019/402 • UserDefaultsΛWrapͯ͠ɺϘΠϥʔϓϨʔτΛ௵͍ͯ͘͠

Slide 15

Slide 15 text

@propertyWrapper struct UserDefault { let key: String let defaultValue: T init(_ key: String, defaultValue: T) { self.key = key self.defaultValue = defaultValue UserDefaults.standard.register(defaults: [key: defaultValue]) } var wrappedValue: T { get { return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } } Property Wrapper x UserDefaults

Slide 16

Slide 16 text

@UserDefault("USES_TOUCH_ID", defaultValue: false) static var usesTouchID: Bool @UserDefault("LOGGED_IN", defaultValue: false) static var isLoggedIn: Bool if !isLoggedIn && usesTouchID { !authenticateWithTouchID() } Property Wrapper x UserDefaults

Slide 17

Slide 17 text

defaultValue == nil ΋Ͱ͖ͦ͏ͩͳ

Slide 18

Slide 18 text

@propertyWrapper struct UserDefault { let key: String let defaultValue: T init(_ key: String, defaultValue: T) { self.key = key self.defaultValue = defaultValue } var wrappedValue: T { get { return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } } Property Wrapper x UserDefaults x Optional

Slide 19

Slide 19 text

@UserDefault("USES_TOUCH_ID", defaultValue: nil) static var usesTouchID: Bool @UserDefault("LOGGED_IN", defaultValue: false) static var isLoggedIn: Bool if !isLoggedIn && usesTouchID { !authenticateWithTouchID() } Property Wrapper x UserDefaults x Optional

Slide 20

Slide 20 text

@UserDefault("USES_TOUCH_ID", defaultValue: nil) static var usesTouchID: Bool @UserDefault("LOGGED_IN", defaultValue: false) static var isLoggedIn: Bool if !isLoggedIn && usesTouchID { !authenticateWithTouchID() } Property Wrapper x UserDefaults x Optional

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

@UserDefault("USES_TOUCH_ID", defaultValue: nil) static var usesTouchID: Bool print(type(of: usesTouchID)) // Optional ܕΛݟͯΈΔ

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

ͱ͍͏͜ͱͰ

Slide 25

Slide 25 text

https://bugs.swift.org/browse/SR-11443

Slide 26

Slide 26 text

SR-11443 Property Wrapper overwrites type declaration • bugs swiftʹग़ͨ͠

Slide 27

Slide 27 text

Simple Case import Foundation var value: Any = "value" @propertyWrapper struct Wrapper { private let defaultValue: Value init(defaultValue: Value) { self.defaultValue = defaultValue } var wrappedValue: Value { get { (value as? Value) ?? defaultValue } set { value = newValue } } } final class Playground { @Wrapper(defaultValue: nil) var explicitlyOptional: String? @Wrapper(defaultValue: nil) var implicitlyOptional: String @Wrapper(defaultValue: "NonOptional") var nonOptional: String func printExplicitlyOptionalType() { print(type(of: self.explicitlyOptional)) } func printImplicitlyOptionalType() { print(type(of: self.implicitlyOptional)) } func printNonOptionalType() { print(type(of: self.nonOptional)) } } let playground = Playground() playground.printExplicitlyOptionalType() // Optional playground.printImplicitlyOptionalType() // Optional playground.printNonOptionalType() // String

Slide 28

Slide 28 text

·ͱΊ

Slide 29

Slide 29 text

·ͱΊ • Property WrapperΛ࢖͍౗ͯ͠ɺόάใࠂΛ͍ͯ͜͠͏

Slide 30

Slide 30 text

&OKPZ1SPQFSUZ8SBQQFS 5IBOLT w NVUBZVUBSP!HNBJMDPN w IUUQTUXJUUFSDPNZVUBJMBOH w IUUQTHJUIVCDPNZVUBJMBOH