Property Wrappers の特徴を眺める #swiftzoomin

>100 Views

March 21, 20

スライド概要

2020/03/21 に swift zoomin' で発表した資料です。プロパティーアクセスしたときに追加処理を行う仕組みの Property Wrappers を、類似機能に感じる didSet と、同じく似たようなことが実現できうる独自型について、特徴を比較しながら Property Wrappers とはどういったものなのかを眺めていきます。

※ Docswell での公開に移行する直前の Slideshare での閲覧数は 783 でした。

profile-image

正統派趣味人プログラマー。プログラミングとは幼馴染です。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Property Wrappers ͷಛ௃ΛோΊΔ ‫۽‬୩༑޺ !FT@LVNBHBJ 4XJGU;PPNJO`

2.

ϓϩύςΟʔ୅ೖ࣌ͷ௥Ճॲཧ willSet / didSet & Property Wrappers 4XJGU

3.

֓ཁ 1SPQFSUZ8SBQQFSTͷ‫ج‬ຊ͔Β

4.

֓ཁ 1SPQFSUZ8SBQQFST  ϓϩύςΟʔͷಡΈॻ͖࣌ʹɺ௥ՃॲཧΛ࣮ߦ͢Δ࢓૊Έ  ‫Ͱܕ‬ఆٛͯ͠ɺଐੑͱͯ͠ϓϩύςΟʔʹׂΓ౰ͯΔ ྨࣅ‫ػ‬ೳʁ ⾣ willSetdidSet

5.

֓ཁ 8SBQQFSͷఆٛ ⾣ ‫ܕ‬Λ@propertyWrapperଐੑΛఴ͑ͯఆٛ ⾣ wrappedValueϓϩύςΟʔΛհͯ͠௥ՃॲཧΛ࣮૷ @propertyWrapper struct PassThrough<Value> { var wrappedValue: Value init(wrappedValue value: Value) { wrappedValue = value } }

6.

֓ཁ 8SBQQFSͷద༻ ⾣ ϓϩύςΟʔΛ@型名ଐੑΛఴ͑ͯఆٛ ⾣ ϓϩύςΟʔͷ‫ܕ‬͸wrappedValueͷ‫ܕ‬Λࢦఆ struct Data { @PassThrough var value: Int }

7.

֓ཁ ߏ଄Πϝʔδ  อଘ৔ॴͱͯ͠XSBQQFE7BMVF͕༻ҙ͞ΕΔ  XSBQQFE7BMVF͸1SPQFSUZ8SBQQFS‫ܕ‬Λհͯ͠ಡΈॻ͖͢Δ Object @XXX var value: YYY @propertyWrapper XXX init(wrappedValue:) એ‫ݴ‬ var wrappedValue ࢀর ॳ‫ظ‬Խ

8.

‫ػ‬ೳൺֱ ྨࣅͦ͠͏ͳ‫ػ‬ೳͱͷൺֱ

9.

‫ػ‬ೳൺֱ ࣮૷ྫΛߟ͑Δ ʲ͓୊ʳཁૉΛ੔ྻͯ֨͠ೲ͢Δม਺  1SPQFSUZ8SBQQFSͰͷ࣮૷ྫ  EJE4FUͰͷ࣮૷ྫ  ಠࣗ‫Ͱܕ‬ͷ࣮૷ྫ

10.

‫ػ‬ೳൺֱ 8SBQQFSͰͷ࣮૷ྫ @propertyWrapper struct Sorting<Element : Comparable> { private var elements: [Element] init(wrappedValue: [Element]) { elements = wrappedValue } var wrappedValue: [Element] { get { elements } set { elements = newValue.sorted() } } } @Sorting var values: [Int] = []

11.

‫ػ‬ೳൺֱ EJE4FUͰͷ࣮૷ྫ var values: [Int] = [] { didSet { values = values.sorted() } }

12.

‫ػ‬ೳൺֱ ಠࣗ‫Ͱܕ‬ͷ࣮૷ྫ struct OrderedArray<Element : Comparable> { private(set) var elements: [Element] public init() { elements = [] } mutating func append(_ element: Element) { elements = (elements + [element]).sorted() } } var values: OrderedArray<Int>

13.

‫ػ‬ೳൺֱ ͦΕͧΕͷಛ௃ 1SPQFSUZ8SBQQFST EJE4FU   ‫૷࣮Ͱܕ‬Λఆٛ   ‫ܕ‬ͷείʔϓ಺ͰॲཧΛ࣮૷ ॴଐઌͷ‫ʹܕ‬Ө‫ڹ‬Λ༩͑ͳ͍ ࣮૷ΛEJE4FUͰఆٛ   ॴଐઌͷείʔϓ಺Ͱॲཧ Ө‫ڹ‬ൣғͷ੍‫͕ޚ‬ඞཁ  ϓϩύςΟʔͱಠཱ࣮ͨ͠૷  ϓϩύςΟʔຖʹຒΊࠐΈ  δΣωϦΫεʹΑΔ൚༻Խ͕Մೳ  ֤ϓϩύςΟʔʹಛԽ࣮ͨ͠૷  ‫Ͱܕ‬ͷఆٛͱద༻͕ඞཁ  खܰͳଈ੮࣮૷  ಡΈॻ͖ͷ྆ํͰ௥Ճॲཧ͕Մೳ  ॻ͖ࠐΈ࣌ͷΈ௥Ճॲཧ͕Մೳ

14.

‫ػ‬ೳൺֱ ͦΕͧΕͷಛ௃ 1SPQFSUZ8SBQQFST ಠࣗ‫ܕ‬   ‫૷࣮Ͱܕ‬Λఆٛ   ͜ͷείʔϓ಺ͰॲཧΛ࣮૷ ॴଐઌͷ‫ʹܕ‬Ө‫ڹ‬Λ༩͑ͳ͍ ‫૷࣮Ͱܕ‬Λఆٛ   ͜ͷείʔϓ಺ͰॲཧΛ࣮૷ ॴଐઌͷ‫ʹܕ‬Ө‫ڹ‬Λ༩͑ͳ͍  ϓϩύςΟʔͱಠཱ࣮ͨ͠૷  ϓϩύςΟʔͱಠཱ࣮ͨ͠૷  δΣωϦΫεʹΑΔ൚༻Խ͕Մೳ  δΣωϦΫεʹΑΔ൚༻Խ͕Մೳ  ଐੑͰϓϩύςΟʔͷੑ࣭Λද‫ݱ‬  ‫Ͱܕ‬ϓϩύςΟʔͷੑ࣭Λද‫ݱ‬

15.

‫ػ‬ೳൺֱ ੑ֨తͳಛ௃ 1SPQFSUZ8SBQQFST EJE4FU ⾣ ‫Ͱܕ‬ఆٛ͢Δߏ଄ ⾣ ίʔυϒϩοΫͰఆٛ͢Δߏ଄ ⾣ ϓϩύςΟʔʹߴ౓ͳॲཧΛ෇༩ ⾣ ୅ೖ‫ޙ‬ͷ௥Ճॲཧͱ࣮ͯ͠૷ ⾣ ଐੑΛ࢖ͬͯؔ࿈෇͚Δ ಠࣗ‫ܕ‬ ⾣ ‫Ͱܕ‬ఆٛ͢Δߏ଄ ⾣ σʔλද‫ػͯ͠ͱݱ‬ೳΛ࣮૷

16.

࢖͍෼͚ͷߟ࡯ ͦͷͨΊͷ֤ํ๏ͷಛ௃ൺֱ  ίʔυͷ࠶ར༻͕૪఺ʁ  ಛघॲཧͷಁ໌ੑ͸ʁ  ΦϒδΣΫτࢦ޲ͱͷ૬ੑ͸ʁ

17.

࢖͍෼͚ͷߟ࡯ ίʔυͷ࠶ར༻͕૪఺ʁ 1SPQFSUZ8SBQQFST EJE4FU ⾣ ಉ͡௥ՃॲཧͳΒ࠶ར༻͕Մೳ ⾣ ϓϩύςΟʔຖʹಛԽ࣮ͨ͠૷ ⾣ δΣωϦΫεʹΑΔ൚༻Խ͕Մೳ ⾣ ࠶ར༻ʹ͸֎෦ؔ਺͕ඞཁ ಠࣗ‫ܕ‬ ⾣ ಉ͡ৼΔ෣͍ͳΒ࠶ར༻͕Մೳ ⾣ δΣωϦΫεʹΑΔ൚༻Խ͕Մೳ

18.

࢖͍෼͚ͷߟ࡯ ಛघॲཧͷಁ໌ੑ͸ʁ 1SPQFSUZ8SBQQFST EJE4FU ⾣ ଐੑʹΑΓ૝૾Մೳ ⾣ ࣮૷Λ‫ͱ͍ͳݟ‬൑ผͰ͖ͳ͍ ⾣ ͨͩ͠ଐੑ͸ϔομʔʹදΕͳ͍ ⾣ ࣮૷͸ϔομʔʹදΕͳ͍ ⾣ ࣮૷Λ‫ͱ͍ͳݟ‬൑ผͰ͖ͳ͍ ಠࣗ‫ܕ‬ ⾣ ‫ʹܕ‬ΑΓ૝૾Մೳ ⾣ ‫ܕ‬৘ใͱͯ͠ϔομʔʹ‫ݱ‬ΕΔ ⾣ ίʔυิ‫ʹ׬‬΋‫ݱ‬ΕΔ

19.

࢖͍෼͚ͷߟ࡯ ΦϒδΣΫτࢦ޲ͱͷ૬ੑ͸ʁ 1SPQFSUZ8SBQQFST ⾣ ‫ܕࢉܭ‬ϓϩύςΟʔͰ ΦʔόʔϥΠυՄೳ ⾣ ΦʔόʔϥΠυͨ͠ઌͰ͸ ଐੑΛ৽ͨʹࢦఆͰ͖ͳ͍ ಠࣗ‫ܕ‬ ⾣ ‫ܕࢉܭ‬ϓϩύςΟʔͰ ΦʔόʔϥΠυՄೳ EJE4FU ⾣ ‫ܕࢉܭ‬ϓϩύςΟʔͰ ΦʔόʔϥΠυՄೳ

20.

࢖͍෼͚ͷཁॴ ֤ํ๏Λ࢖͍෼͚Δ൑அࡐྉͱͳΓಘΔࣄฑ

21.

1SPQFSUZ8SBQQFST ⾣ ‫ط‬ଘͷ‫ʹܕ‬ɺ൚༻తͳ௥Ճੑ࣭Λ෇༩ ⾣ ϓϩύςΟʔʹద༻Ͱ͖ΔϓϩτίϧΈ͍ͨͳଘࡏ ⾣ ಡΈॻ͖ͷ྆ํʹରԠ ‫ʹܕ‬ಛੑΛ෇༩ > ϓϩτίϧΈ͍ͨͳҹ৅ EJE4FU ⾣ ؆୯ɾ໌ྎʹ௥ՃॲཧΛ࣮૷Ͱ͖Δ‫ػ‬ೳ ⾣ ॴଐઌͷείʔϓͰಈ࡞ɺີ઀ʹ࿈‫͢ܞ‬Δͷ͕༰қ ⾣ ॻ͖ࠐΈ࣌ͷΈରԠ ௥ՃॲཧΛ࣮૷ > defer Έ͍ͨͳҹ৅ ಠࣗ‫ܕ‬ ⾣ σʔλߏ଄ͱͯ͠ੑ࣭Λ࣮૷ ⾣ ௥Ճॲཧͱͯ͠Ͱ͸ͳ͘ɺ஋ͦͷ΋ͷͷੑ֨Λ‫ن‬ఆ σʔλ‫ܕ‬Λఆٛ

22.

ಛ༗ͷ‫ػ‬ೳ 1SPQFSUZ8SBQQFSͳΒͰ͸ͷ‫ػ‬ೳΛ೺Ѳ

23.

ಛ༗ͷ‫ػ‬ೳ 4ZOUIFTJ[FE4UPSBHF1SPQFSUZ ⾣ _Λ෇໊͚ͨલͰࣗಈఆٛ ⾣ QSJWBUFͳ1SPQFSUZ8SBQQFS‫ܕ‬ͷ஋ A Type ⾣ ஋Λӡ༻͢ΔͨΊͷ‫ػ‬ೳΛ 1SPQFSUZ8SBQQFS‫͕ܕ‬ఏ‫ڙ‬Մೳ ⾣ QSJWBUFΞΫηεϨϕϧͰ ॴଐઌͷ಺ଆͰ͚ͩར༻Մೳ @Sorting var values: [Int] private var _values: Sorting<Int>

24.
[beta]
ಛ༗ͷ‫ػ‬ೳ

1SPQFSUZ8SBQQFS‫ʹܕ‬ϝιουΛ౥ࡌ
⾣

4ZOUIFTJ[FE4UPSBHF1SPQFSUZʹ೚ҙͷϝιουΛ౥ࡌՄೳ

⾣

FYUFOTJPOΛ࢖ͬͯͷ౥ࡌ΋Մೳ

@propertyWrapper
extension Sorting {
func ascending -> [Element] {

A Type
@Sorting var values: [Int]

elements.sorted(by: <)
}
}

func XXXX() {
_values.sorted(by: .ascending)

25.
[beta]
ಛ༗ͷ‫ػ‬ೳ

Ҿ਺ʹΑΔॳ‫ظ‬Խ
⾣

ΠχγϟϥΠβʔͰXSBQQFE7BMVFҎ߱ʹҾ਺Λ௥Ճ

⾣

࢖༻࣌ʹύϥϝʔλʔΛࢦఆՄೳʹ

@propertyWrapper
struct Sorting<Element> {
init(wrappedValue: [Element], order: Order) {
}
A Type
@Sorting(order: .descending) var values: [Int] = []

26.

ಛ༗ͷ‫ػ‬ೳ ‫ط‬ఆΠχγϟϥΠβʔ ⾣ Ҿ਺ͳ͠ͷΠχγϟϥΠβʔΛఆٛͯ͠‫ط‬ఆ஋Λఆٛ ⾣ ॳ‫ظ‬஋Λ‫ه‬ड़͠ͳ͍ॳ‫ظ‬ԽΛఏ‫ڙ‬Մೳ @propertyWrapper struct Sorting<Element> { A Type @Sorting var values: [Int] init() { elements = [] } ⾣ એ‫ظॳͰ͚ͩݴ‬Խ΋࣮ߦ ⾣ ॴଐઌͷΠχγϟϥΠβʔͰ ॳ‫ظ‬Խ͢Δ৔߹Ͱ΋࣮ߦ͞ΕΔ

27.

ಛ༗ͷ‫ػ‬ೳ 1SPKFDUJPO7BMVF ⾣ QSPKFDUFE7BMVFΛఆ͓ٛͯ͘͠ͱ$Λ෇໊͚ͨલͰར༻Մೳʹ ⾣ ࿈‫͢ܞ‬Δ೚ҙͷ஋Λఏ‫ڙ‬Մೳ @propertyWrapper struct Sorting<Element> { var projectedValue: SomeType { A Type @Sorting var values: [Int] } private var $values: SomeType

28.

&OKPZ4XJGU 5IBOLZPV ‫۽‬୩༑޺ !FT@LVNBHBJ