Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

࣮੷ डୗ ࣗࣾ

Slide 5

Slide 5 text

.PEFSO4XJGU"1*%FTJHO IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED

Slide 6

Slide 6 text

1SPQFSUZ8SBQQFST

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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.

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

ྫ ʮ஗ԆॳظԽʯ

Slide 12

Slide 12 text

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 } } }

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

ྫ ʮ6TFS%FGBVMUTʯ

Slide 15

Slide 15 text

@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) } } }

Slide 16

Slide 16 text

@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"

Slide 17

Slide 17 text

΋͏গ͠ৄ͘͠

Slide 18

Slide 18 text

ॻ͖׵͑ϧʔϧ @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>

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

ࢀߟࢿྉ w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZ XXED w IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPO CMPCNBTUFSQSPQPTBMTQSPQFSUZ XSBQQFSTNE