Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift

-- Views

August 30, 16

スライド概要

Swift 3 は、ガイドラインを知っておくと変化がとっても掴みやすくなる印象。そう思って、そんな辺りについてざっくり見渡せるように資料にまとめておくことにしました。

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

profile-image

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

シェア

またはPlayer版

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

ダウンロード

関連スライド

各ページのテキスト
1.

4XJGU  Λॻ͘ͱ͖ʹ஌͓͖͍ͬͯͨ "1*%FTJHO(VJEFMJOFT ",*#"TXJGUº4XJGUѪ޷ձPO &;/&5‫۽‬୩༑޺ IUUQF[OFUKQ 4XJGU%FWFMPQFS1SFWJFX

2.

ૉఢͳ"1*Λɺॻ͖·͠ΐ͏ CZ4XJGU"1*%FTJHO(VJEFMJOFT

3.

‫۽‬୩༑޺ 5PNPIJSP,VNBHBJ ⾣ 4XJGU‫͕ޠݴ‬௒େ޷͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕େ޷͖Ͱ͢ʂ ⾣ ϓϩάϥϛϯάͷָ͠͞Λ఻͍͖͍͑ͯͨɻ !FT@LVNBHBJ UPNPIJSPLVNBHBJ $PEF1JFDFGPSNBD04 IUUQF[OFUKQ 9DPEFపఈղઆ

4.

UI"VHVTU

5.

話してきました IUUQTJPTEDKQDOPEF NJO

6.

ษ‫ڧ‬ձΛ։࠵͍ͯ͠·͢ɻ Θ͍Θ͍ɺָ͘͠ɺ ΈΜͳͰ‫ޠ‬Β͑Δ৔ॴΛ໨ࢦͯ͠ɻ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ DTXJGU !ԣ඿ɾ੨༿୆ ୈճ໨͸݄೔ͷ։࠵ʢ໨ඪʣ ୈճ໨Λ݄̏̕೔ʹ։࠵ IUUQTBUOEPSHHSPVQTZJEFW IUUQTBUOEPSHHSPVQTDTXJGU

7.

΋͏ͻͱͭɺษ‫ڧ‬ձΛ࢝Ί·͢ʂ 4XJGUͷ‫ૅج‬ΛΈΜͳͱ෮श͍ͨ͠ɻ ͜Ε͔Β࢝ΊΔਓͱ΋௒্‫ͱऀڃ‬΋Ұॹʹɻ ΈΜͳͰ4XJGU ෮शձ NJOOB@EF@TXJGU ˏौ୩ ୈճ໨Λ݄೔ʹ։࠵ IUUQDTXJGUDPOOQBTTDPN

8.

ωοτϥδΦ Ќ์ૹ։࢝ ϓϩάϥϛϯά͕େ޷͖ͳ̎ਓͰɺ ϓϩάϥϜ‫ޠָ͍ͯͭ͘͠ʹޠݴ‬Β͏൪૊ NPPLNPPLSBEJP Ќ൛ ‫۽‬୩ͱ៸໘͕ϓϩάϥϛϯάίʔυͷ಺͔Β ௌ͑ͯ͘͜Δ੠ʹࣖΛ܏ָ͚ͯ͠ΉϥδΦ IUUQNPPLNPPLSBEJPDPNB

9.

4XJGU XJMMCFSFMFBTFETPNFUJNFJOMBUF

10.

4XJGU%FWFMPQFS1SFWJFX IBTCFFOSFMFBTFEPO"VHVTU 

11.

4XJGU"1*%FTJHO(VJEFMJOFT IUUQTTXJGUPSHEPDVNFOUBUJPOBQJEFTJHOHVJEFMJOFT

12.

લճͷ4XJGUѪ޷ձ 4XJGU໋໊‫ن‬ଇͷมߋʹ ؔ৺͕͋Δਓ͕ଟ͍ҹ৅ͩͬͨ

13.

ࠓճͷ໨ඪ 4XJGUͷഁյతมߋͷࠜ‫ݯ‬ 4XJGU"1*%FTJHO(VJEFMJOFTΛ஌Δ

14.

4XJGU"1*%FTJHO(VJEFMJOFT 4XJGU"1*%FTJHO(VJEFMJOFT ⾣ ૉ੖Β͍͠"1*Λॻͨ͘Ίͷࢦ਑ ⾣ 4XJGU͸͜Εʹै͏ ⾣ ஌Δͱ4XJGU͕ॻ͖΍͘͢ͳΔ

15.

4XJGU"1*%FTJHO(VJEFMJOFT ॻ͔Ε͍ͯΔ͜ͱ ⾣ ‫ج‬ຊ‫ݪ‬ଇ 'VOEBNFOUBMT ͜Μͳ͜ͱʹ৺͕͚ͯॻ͖·͠ΐ͏ ⾣ ໋໊‫ن‬ଇ /BNJOH ͜Μͳ໊લΛ͚ͭ·͠ΐ͏ ⾣ ‫׳‬श $POWFOUJPOT ී௨͸͜Μͳ;͏ʹॻ͖·͢Α ⾣ ಛผͳѻ͍ 4QFDJBM*OTUSVDUJPOT ͜Μͳͱ͖͸͜͏͠·͢Α

16.

4XJGU"1*%FTJHO(VJEFMJOFT େࣄͳ͜ͱ ΨΠυϥΠϯ͸ ‫ݪ‬ଇͰ͋Γɺઈର Ͱ͸ͳ͍

17.

4XJGU"1*Λॻ্͘Ͱ ஌͓͖͍ͬͯͨͱ͜ΖΛ঺հ

18.

‫ج‬ຊ‫ݪ‬ଇ

19.

‫ج‬ຊ‫ݪ‬ଇ ͜Ε·Ͱͱɺ͜Ε͔Β 4XJGU pointer.assignFrom(source, count: 100) ⾣ ⾣ ୈ̍Ҿ਺ͱͷؔ܎Λɺؔ਺໊Ͱઆ໌͍ͯͨ͠ ୈ̍Ҿ਺ͷϥϕϧ໊͸ɺ‫ط‬ఆͰলུ͢ΔΑ͏ʹͳΔ 4XJGU pointer.assign(from: source, count: 100) ⾣ ⾣ ୈ̍Ҿ਺ͱͷؔ܎͸ɺϥϕϧ໊Ͱઆ໌͢Δ ୈ̍Ҿ਺ͷϥϕϧ໊͸ɺ‫ط‬ఆͰ໌‫͕ه‬ඞཁʹͳΔ

20.

‫ج‬ຊ‫ݪ‬ଇ ໨࣍  ӳจͱͯࣗ͠વʹಡΊΔΑ͏ʹ  ‫Ͱܕ‬͸ͳ͘ɺ໾ׂͰ໊લΛ͚ͭΔ  ෆඞཁͳ‫۟ޠ‬͸লུ͢Δ  ͢΂ͯͷ‫͔۟ޠ‬ΒᐆດੑΛআ͘  Ҿ਺ϥϕϧʹલஔࢺΛ‫ؚ‬Ίͳ͍৔߹  ද‫͖͠ݱ‬Εͳ͍࣌͸ɺϥϕϧ໊Ͱิ଍  ෭࣍తͳҾ਺Ͱɺӳจ๏͸‫͍ͳ͠ʹؾ‬  ઐ໳༻‫ޠ‬ͷ࢖༻͸ɺ‫ۃݟ‬Ί͕ඞཁ

21.

‫ج‬ຊ‫ݪ‬ଇ ӳจͱͯࣗ͠વʹಡΊΔΑ͏ʹ ⾣ ࢖༻࣌ʹɺӳจͷΑ͏ʹಡΊΔΑ͏ʹ͢Δ // album, insert photo at current page. album.insert(photo, at: currentPage) // album's photos remove all keeping capacity. album.photos.removeAll(keepingCapacity: true) // album, insert photo page current page. album.insert(photo, page: currentPage) // album's photos remove all capacity. album.photos.removeAll(capacity: true)

22.

‫ج‬ຊ‫ݪ‬ଇ ‫Ͱܕ‬͸ͳ͘ɺ໾ׂͰ໊લΛ͚ͭΔ ⾣ Ҿ਺ม਺ɺ෇ଐ‫ܕ‬͸ɺ໾ׂͰ໊લΛ͚ͭΔ ⾣ ‫ʹ໊ܕ‬Ԋ໊ͬͨલ͸ɺ໌ྎ͞΍ද‫ྗݱ‬Λଛͳ͏ // 要素の配列 から位置 x に該当するものを消す。 associatedtype ContentView : UIView func suffix(from start: Index) -> SubSequence // 完全に役目を汲み取れなくなる例 associatedtype ViewType : UIView // 型寄りの index よりは、役割寄りの start が明瞭な例 func suffix(from index: Index) -> SubSequence

23.

‫ج‬ຊ‫ݪ‬ଇ ෆඞཁͳ‫۟ޠ‬͸লུ͢Δ ⾣ આ໌͕ͳͯ͘΋໌Β͔ͳ໊લ͸ɺল͘ ⾣ ൚༻తͳ໊લͷొ৔΋๷͛Δ // 要素の配列 から、要素 x を消す。 elements.remove(x) // 要素型の x であれば“要素である”ことは自明 elements.removeElement(x) // デバイスの配列 で“element”という言葉は不適切 devices.removeElement(device) // デバイスの配列 から、デバイスを消す。 devices.remove(device)

24.

‫ج‬ຊ‫ݪ‬ଇ ͢΂ͯͷ‫͔۟ޠ‬ΒᐆດੑΛআ͘ ⾣ ‫۟ޠ‬ͷҙຯ͕ϒϨͳ͍Α͏ʹ͢Δ ⾣ ͦΕΛফ͍ͨ͠ͷ͔ɺͦ͜ʹ͋ΔͷΛফ͍ͨ͠ͷ͔ // 要素の配列 から位置 x に該当するものを消す。 elements.remove(at: index) // 要素の配列 から、要素 y を消す。 elements.remove(y) 1PJOU લऀɺফ͍ͨ͠ͷ͸YͰ͸ͳ͘FMFNFOUT<Y>ͷཁૉͰ͋Δ ⾣ ‫ऀޙ‬ɺม਺Z͕&MFNFOU‫ͳܕ‬ΒlཁૉZzͱಡΊΔ ⾣ ҐஔΛࣔ͢Ҿ਺͸ɺલஔࢺQSFQPTJUJPOQISBTFͰද‫͢ݱ‬Δ ⾣

25.

‫ج‬ຊ‫ݪ‬ଇ Ҿ਺ϥϕϧʹલஔࢺΛ‫ؚ‬Ίͳ͍৔߹ ⾣ ࠷ॳͷҾ਺͚ͩͰҐஔΛࣔ͢ͳΒɺϥϕϧ໊ʹॻ͘ ⾣ ෳ਺ͷҾ਺ͰҐஔΛࣔ͢ͳΒɺؔ਺໊ʹॻ͘ // 記録から、位置 x に該当する値を取得。 records.value(at: x) // 記録から、列 y 行 z に該当する値を取得。 records.valueAt(row: y, column: z) // 複数で構成時、ラベルに入れるとバランスが悪い。 records.value(atRow: y, column: z)

26.

‫ج‬ຊ‫ݪ‬ଇ ද‫͖͠ݱ‬Εͳ͍࣌͸ɺϥϕϧ໊Ͱิ଍ ⾣ ҙຯ͕ෆ଍ͨ͠Βɺϥϕϧ໊΍ؔ਺໊Ͱิ଍͢Δ ⾣ ൚༻‫ܕ‬/40CKFDU "OZ 4USJOH *OUͳͲͰ‫͜ى‬ΓಘΔ // 指定したキーに対する値を更新する。 func updateValue(_ value: Any, forKey key: String) // 名前で補足しないと、使用時に意味が汲み取れない。 updateValue(100, forKey: "A") update(100, for: "A") 1PJOU ‫ܕ‬Ҿ਺΍෇ଐ‫Ͱܕ‬΋ɺ‫ܕ‬ଋറ͕ऑ͚Ε͹ಉ༷ ⾣ ୈ̍Ҿ਺ͷ৔߹Ͱϥϕϧͳ͠ͷ৔߹͸ɺؔ਺໊Ͱઆ໌͢Δ ⾣

27.

‫ج‬ຊ‫ݪ‬ଇ ෭࣍తͳҾ਺Ͱɺӳจ๏͸‫͍ͳ͠ʹؾ‬ ⾣ ओ໨తͰͳ͍Ҿ਺͸ɺจষʹͳΒͳͯ͘ྑ͍ ⾣ ͦΕΒ͸Ұൠʹɺୈ̎Ҿ਺΍ୈ̏Ҿ਺Ҏ߱ʹஔ͔ΕΔ // 主目的はメッセージの表示。第2引数以降は副次的。 func print(_ items: Any..., separator: String, terminator: String, to output: inout Target)

28.

‫ج‬ຊ‫ݪ‬ଇ ઐ໳༻‫ޠ‬ͷ࢖༻͸ɺ‫ۃݟ‬Ί͕ඞཁ ⾣ ୭Ͱ΋൑Δ‫ݴ‬༿͕͋ΔͳΒɺͦΕΛ࢖͏ ⾣ ઐ໳༻‫ޠ‬͸ɺͦͷ‫ݴ‬༿Ͱͳ͍ͱҙຯΛଛͳ͏ͱ͖ʹ࢖͏ // 電子計算機の分野で、正弦関数 sin は適切な共通認識。 let answer = sin(1.5) // 言葉を適切に把握してないと、何が起こるか判らない。 rinoa.junctioned(to: Bahamut.self).megaFlare() 1PJOU ུ‫ޠ‬΋ઐ໳༻‫ޠ‬ͷ͏ͪʢ.#1ͳͲʣ ⾣ ର৅෼໺Ͱ‫ڞ‬௨ೝ͕ࣝ‫ظ‬଴Ͱ͖Δઐ໳༻‫ޠ‬͸ɺΉ͠Ζ޷·͍͠ ⾣ ແҋʹ1PLÉNPOΛ࣋ͪग़͢ͷ͸ɺΨΠυϥΠϯʹ൓͢Δʁ ⾣

29.

‫͍ͨ͠ʹؾ‬ͷ͸ɺલஔࢺͷѻ͍ ӳจΈ͍ͨʹಡΊΔ͜ͱҙࣝͯ͠ॻ͘

30.

ίϝϯτΛॻ͘

31.

ίϝϯτΛॻ͘ ໨࣍  ॻ͘աఔͰ"1*͕ચ࿅͞ΕΔ  ֓ཁઆ໌ͷॻ͖ํ w ؔ਺͸lԿΛͯ͠ɺԿΛฦ͢zͷ͔ w ఴࣈ͸lԿʹΞΫηε͢Δzͷ͔ w ΠχγϟϥΠβʔ͸lԿΛ࡞Δzͷ͔ w ͦΕҎ֎͸lͦΕͬͯԿzͳͷ͔  ඞཁͰ͋Ε͹ɺଓ͚ͯৄࡉΛॻ͘  ϓϩύςΟʔͰ0  Ҏ֎͸໌‫͢ه‬Δ

32.

ίϝϯτΛॻ͘ ॻ͘աఔͰ"1*͕ચ࿅͞ΕΔ ⾣ ͢΂ͯͷఆٛʹυΩϡϝϯτίϝϯτΛॻ͜͏ ⾣ ֓ཁઆ໌Λ̍จͰॻ͖ɺඞཁͳΒৄࡉઆ໌΋ॻ͘ /// Inserts a new element /// into the collection at the specified index. func insert(_ newElement: _Element, at i: Index) 1PJOU આ໌ͦͷ··ͷྲྀΕͰ"1*͕ද‫͍͖ͯͰݱ‬Δ͔ ⾣ ͍͍ͨͯɺ֓ཁͱఆٛͰ͡Ύ͏ͿΜઆ໌͕ͭ͘ ⾣ ؆୯ͳ‫ݴ‬༿Ͱઆ໌Ͱ͖ͳ͍ͳΒ"1*σβΠϯΛٙͬͯΈΔ ⾣

33.

ίϝϯτΛॻ͘ ֓ཁઆ໌ͷॻ͖ํ  ؔ਺͸lԿΛͯ͠ɺԿΛฦ͢zͷ͔ %PFTTPNFUIJOHBOESFUVSOTTPNFUIJOH  ఴࣈ͸lԿʹΞΫηε͢Δzͷ͔ "DDFTTFTTPNFUIJOH  ΠχγϟϥΠβʔ͸lԿΛ࡞Δzͷ͔ $SFBUFTTPNFUIJOH  ͦΕҎ֎͸lͦΕͬͯԿzͳͷ͔ 4PNFUIJOH

34.

ίϝϯτΛॻ͘㲊֓ཁઆ໌ͷॻ͖ํ  ؔ਺͸lԿΛͯ͠ɺԿΛฦ͢zͷ͔ ⾣ ͲΜͳ࡞༻͔ͱɺͲΜͳ໭Γ஋͔Λॻ͘ ⾣ ࡞༻΍໭Γ஋ʹ͍ͭͯɺແ͍΋ͷ͸ॻ͔ͳ͍ /// Advances to the next element and returns it, /// or `nil` if no next element mutating func next() -> Element? /// Returns a new string by concatenating the /// elements of the sequence, adding the given /// separator between each element. func joined(separator: String = default) -> String

35.
[beta]
ίϝϯτΛॻ͘㲊֓ཁઆ໌ͷॻ͖ํ 

ఴࣈ͸lԿʹΞΫηε͢Δzͷ͔
⾣ ఴࣈͰԿʹΞΫηε͢Δ͔Λॻ͘
⾣ "DDFTTFTʜͰॻ͖͸͡ΊΔͷ͕Ұൠత

/// Accesses the code unit at the given position.
subscript(position: Index) -> CodeUnit { get }

36.

ίϝϯτΛॻ͘㲊֓ཁઆ໌ͷॻ͖ํ  ΠχγϟϥΠβʔ͸lԿΛ࡞Δzͷ͔ ⾣ ͲΜͳΠϯελϯεΛੜ੒͢Δ͔Λॻ͘ ⾣ $SFBUFTʜͰॻ͖͸͡ΊΔͷ͕Ұൠత /// Creates a view of the given string. init(_ text: String)

37.

ίϝϯτΛॻ͘㲊֓ཁઆ໌ͷॻ͖ํ  ͦΕҎ֎͸lͦΕͬͯԿzͳͷ͔ ⾣ ؔ਺ɾఴࣈɾΠχγϟϥΠβʔҎ֎͸ͦΕ͕Կ͔Λॻ͘ ⾣ ‫ܕ‬͸lͲΜͳ‫ܕ‬z͔ɺϓϩύςΟʔ͸lͲΜͳ஋z͔ /// A raw pointer for accessing untyped data. struct UnsafeMutableRawPointer { … } /// A textual representation of the range. var description: String { get } /// Access the `Pointee` instance referenced by `self`. var pointee: Pointee { get }

38.

ίϝϯτΛॻ͘ ඞཁͰ͋Ε͹ɺଓ͚ͯৄࡉΛॻ͘ ⾣ ඞཁʹԠͯ͡ɺ֓ཁͷ‫ࡉৄ͚ͯ͋ߦ̍ʹޙ‬Λॻ͘ ⾣ 4ZNCPM%PDVNFOUBUJPO.BSLVQΛ࢖͏ /// Creates a new value, rounded to the closest /// possible representatation. /// /// If two representable values are equally close, /// the result is the value with more trailing /// zeros in its significand bit pattern. /// /// - Parameter value: The integer to convert /// to a floating-point value. init(_ v: Int8)

39.

ίϝϯτΛॻ͘ ϓϩύςΟʔͰ0  Ҏ֎͸໌‫͢ه‬Δ ⾣ ෳࡶͳ‫ࢉܭ‬Λߦ͏ϓϩύςΟʔ͸ɺෳࡶ͞Λ໌‫͢ه‬Δ ⾣ ϓϩύςΟʔࢀর͸0  ͱࢥ͍ࠐ·Ε͕ͪ /// Returns the number of elements. /// /// - Complexity: O(1) if `Self` conforms /// to `RandomAccessCollection`; O(N) otherwise. var count: IndexDistance { get } 1PJOU ෳࡶ͕͞0  ͷ৔߹΋ɺ໌‫͢ه‬Δͱࢀߟʹ͠΍͍͢ ⾣ ΠχγϟϥΠβʔ΍ؔ਺΋ɺෳࡶ͞ͷ໌‫͕͋ه‬Δͱྑ͍ ⾣

40.

4ZNCPM%PDVNFOUBUJPO.BSLVQ

41.

ίϝϯτΛॻ͘㲊4ZNCPM%PDVNFOUBUJPO.BSLVQ ֓ཁ ⾣ આ໌ʹҙຯ͚ͮͰ͖ΔϚʔΫΞοϓ‫ޠݴ‬ ⾣ Ͱॻ͖࢝ΊɺΩʔϫʔυͰҙຯΛఴ͑Δ /// Creates a new value, rounded to the closest /// possible representatation. /// /// If two representable values are equally close, /// the result is the value with more trailing /// zeros in its significand bit pattern. /// /// - Parameter value: The integer to convert /// to a floating-point value. init(_ v: Int8)

42.

ίϝϯτΛॻ͘㲊4ZNCPM%PDVNFOUBUJPO.BSLVQ ޮՌ ⾣ ΫΠοΫϔϧϓͰ‫ݟ‬΍͘͢දࣔ͞ΕΔ ⾣ "1*Λ࢖͏ଆʹͱͬͯ΋‫͍͠خ‬ let f = Double.init(_:) as (Int8) -> Double

43.

ίϝϯτΛॻ͘㲊4ZNCPM%PDVNFOUBUJPO.BSLVQ ৄࡉ ⾣ Ҏલʹ·ͱΊͨࢿྉ͸ͪ͜Β IUUQXXXTMJEFTIBSFOFUUPNPIJSPLVNBHBJTXJGU

44.

ίϝϯτ͸"1*Λચ࿅͢Δ ॻ͘ͷΛઌૹΓ͠ͳ͍

45.

໊લ෇͚ͷ‫׳‬श

46.

໊લ෇͚ͷ‫׳‬श ໨࣍  ‫໊ܕ‬΍ม਺໊ͷ෇͚ํ  ؔ਺໊͸ࣗ਎΁ͷӨ‫ʹڹ‬ΑͬͯมΘΔ  ਅِΛ൑ఆ͢Δϝιου໊ͷ෇͚ํ  ϑΝΫτϦʔϝιουͷ‫׳‬श  ΠχγϟϥΠβʔͷ‫׳‬श  ྻ‫໊ࢠڍ‬͸খจࣈ͔Β࢝ΊΔ  ϓϩτίϧ໊ͷ෇͚ํ  ϓϩτίϧΛ෇ଐ‫͖ͱ͏࢖Ͱܕ‬ͷ‫׳‬श

47.

໊લ෇͚ͷ‫׳‬श ‫໊ܕ‬΍ม਺໊ͷ෇͚ํ ⾣ Ұൠʹɺ໊લ͸໊ࢺͰ͚ͭΔ ⾣ ਅِΛද͢ϓϩύςΟʔ໊͸ɺର৅ͷओுͰද‫͢ݱ‬Δ // 型は名詞で名前をつける。 struct ObjectIdentifier { … } // 変数名は名詞でつける。 let identifier = ObjectIdentifier(object) // 真偽値プロパティーは主張重視。配列が空であるか。 items.isEmpty

48.

໊લ෇͚ͷ‫׳‬श ؔ਺໊͸ࣗ਎΁ͷӨ‫ʹڹ‬ΑͬͯมΘΔ ⾣ ࣗ਎΁ͷӨ‫͕͋ڹ‬Δ͔Ͱɺ໊લΛม͑Δ ⾣ ໊લ໊͕ࢺ‫͔ܥ‬ಈࢺ‫Ͱ͔ܥ‬ɺ໋໊ํ๏͕มΘΔ // 名詞系で、自身に影響しない場合は、名詞そのまま。 let answer = value.squareRoot() // 名詞系で、自身に影響する場合は“form”接頭辞。 value.formSquareRoot() // 動詞系で、自身に影響ないなら“-ed”か“-ing”接尾辞。 let answer = value.divided(by: 3) // 動詞系で、自身に影響するなら、動詞そのまま。 value.divide(by: 3)

49.

໊લ෇͚ͷ‫׳‬श ਅِΛ൑ఆ͢Δϝιου໊ͷ෇͚ํ ⾣ ର৅ͷओுͱͯ͠἞ΈऔΕΔ໊લʹ͢Δ ⾣ ී௨ͷϝιουͱ͸ผͷ‫ن‬ଇͰ໊લΛ͚ͭΔ // 範囲が、ある範囲と、重なる点があるか if range1.overlaps(range2) { … } // 配列が、要素を、含んでいるか if items.contains(item) { … } // 要素を返してるのか、要素を含むか判定してるのか。 let answer = items.contained(item) { … }

50.

໊લ෇͚ͷ‫׳‬श ϑΝΫτϦʔϝιουͷ‫׳‬श ⾣ ઀಄ࣙlNBLFzͰࣔࠦ͠ɺଓ͚ͯ࡞Δ΋ͷΛ໌‫͢ه‬Δ ⾣ Ұൠʹϥϕϧ໊͸লུͤͣɺӳจ๏ʹ΋߆ΘΒͳ͍ // 内容を列挙するイテレーターを作る。 func makeIterator() -> Iterator // ボタンを作る。表題を受け取る。 func makeButton(caption: String) -> NSButton // ラベル名の英文的な流れは気にしない func makeButton(havingCaption: String) -> NSButton

51.

໊લ෇͚ͷ‫׳‬श ΠχγϟϥΠβʔͷ‫׳‬श ⾣ ಉ͡஋Λද‫͢ݱ‬ΔͳΒɺ࠷ॳͷϥϕϧΛলུ͢Δ ⾣ Ճ޻΍࠶ղऍΛ൐͏ͳΒɺ࠷ॳͷϥϕϧΛলུ͠ͳ͍ // 同じ値を表現する場合は、素直な型変換を表現する。 let value = Int32(value64) // 再解釈を伴うなら、何が起こるかラベルで示唆する。 let value : Int32(truncatingBitPattern: value64) 1PJOU ୈ̍Ҿ਺ʹϥϕϧ͕͋Δ͔Ͱɺૉ௚ͳม‫͔׵‬ɺՃ޻͔͕൑Δ ⾣ ୈ̎Ҿ਺Ҏ߱͸ɺͲͪΒͷ৔߹΋ϥϕϧΛ࣋ͭͷ͕Ұൠత ⾣ ϥϕϧ໊͸ӳจ๏ʹ߆ΘΒͳ͍ʜ$PMPS SFES HSFFOH CMVFC ⾣

52.

໊લ෇͚ͷ‫׳‬श ྻ‫໊ࢠڍ‬͸খจࣈ͔Β࢝ΊΔ ⾣ -PXFS$BNFM$BTFͰ໊લΛ͚ͭΔ // 列挙子の名前は小文字で始める。 enum UnicodeDecodingResult { case scalarValue(UnicodeScalar) case emptyInput case error } 1PJOU 4XJGUͰ͸6QQFS$BNFM$BTFͩͬͨ ⾣ ྻ‫ͱ໊ࢠڍ‬ɺ஋Λུͨ͠4USJOHͷ3BX஋͸࿈ಈ͢ΔͷͰ஫ҙ ⾣ 6QQFS$BNFM$BTFͰ໊෇͚Δͷ͸ɺ‫ͱ໊ܕ‬ϓϩτίϧ໊͚ͩ ⾣

53.

໊લ෇͚ͷ‫׳‬श ϓϩτίϧ໊ͷ෇͚ํ ⾣ ۩ମతͳԿ͔Λද͢ͳΒɺ໊ࢺͰ͚ͭΔ ⾣ ੑ࣭తͳ΋ͷͳΒɺ઀ඌࣙlBCMFz΍lJOHzΛ͚ͭΔ // 具体的に“コレクション”を表現するので、名詞。 protocol Collection { … } // 比較可能性を表現するので、接尾辞“-able”な名前。 protocol Comparable { … } 1PJOU ໾ׂతͳ໊લʹ͸ɺ઀ඌࣙl1SPUPDPMzΛ͚ͭΔ৔߹͕͋Δ ⾣ ΨΠυϥΠϯతʹɺ઀ඌࣙl1SPUPDPMzΛ͚ͭΔ‫ن‬ఆ͸ͳ͍ ⾣

54.

໊લ෇͚ͷ‫׳‬श ϓϩτίϧΛ෇ଐ‫͖ͱ͏࢖Ͱܕ‬ͷ‫׳‬श ⾣ ໊শͱ໾ׂ͕ಉ͡ͳΒɺ઀ඌࣙ5ZQFͰিಥճආ͢Δ ⾣ ඪ४Ͱ͸ɺ෇ଐ‫઀ʹ໊ܕ‬ඌࣙ1SPUPDPM͕ओྲྀʁ // プロトコル名が役割と一致するなら、名称に Type を付与 associatedtype IteratorType : Iterator // ただし、標準ではプロトコル名に Protocol が主流 associatedtype Iterator : IteratorProtocol 2VFTUJPO લऀɺੑ࣭Λද‫͢ݱ‬Δϓϩτίϧଆʹl5ZQFzΛఴ͍͑ͨҹ৅ ⾣ ‫ऀޙ‬ɺར༻໊Λ‫ݟ‬ӽͯ͠ϓϩτίϧ໊ΛܾΊΔͷɺࠅͳҹ৅ ⾣ ඪ४ϥΠϒϥϦ͕ɺΨΠυϥΠϯͱໃ६͍ͯ͠Δҹ৅ ⾣

55.

‫׳‬शΛ஌Ε͹ɺॻ͖΍͘͢ͳΔ ӳจΛҙࣝ͢Ε͹ɺͳΜͱͳ͘௫Ίͦ͏

56.

ఆٛΛ΋ͬͱચ࿅͢Δ

57.

ఆٛΛ΋ͬͱચ࿅͢Δ ໨࣍  ҧ͏‫ػ‬ೳʹಉ໊͡લΛ࢖Θͳ͍  ‫ط‬ఆ஋Ͱɺؔ࿈ੑΛද‫͖Ͱݱ‬Δ  ໭Γ஋͚ͩͰͷPWFSMPBE͸͠ͳ͍  େҬؔ਺ΑΓ΋ϝιουΛ࢖͏  ҙຯͷͳ͍ϥϕϧ໊͸লུ͢Δ  δΣωϦοΫಛ༗ͷᐆດੑʹ஫ҙ

58.

ఆٛΛ΋ͬͱચ࿅͢Δ ҧ͏‫ػ‬ೳʹಉ໊͡લΛ࢖Θͳ͍ ⾣ ‫ج‬ຊతͳҙຯ߹͍͕ಉ͡ͱ͖ɺ‫ج‬ຊ໊Λ‫ڞ‬༗͢Δ ⾣ ॴଐΛ‫͛ލ‬͹ɺҟͳΔҙຯʹ࢖ͬͯྑ͍ // 同じ所属で、違う意味で基本名を共有している。 class Database { func index() func index(of row: Row) -> Int } // 索引の再構築 // 行番号の取得 // 所属外とは干渉しない。所属内では同じ意味。 struct Bookshelf { func index(_ i: Int, offsetBy n: Int) -> Int { … } func index(after i: Int) -> Int { … } }

59.

ఆٛΛ΋ͬͱચ࿅͢Δ ‫ط‬ఆ஋Ͱɺؔ࿈ੑΛද‫͖Ͱݱ‬Δ ⾣ ‫ط‬ఆ஋Ͱද‫͖Ͱݱ‬ΔͳΒɺ0WFSMPBE͸࢖Θͳ͍ ⾣ ಉ౳ͷ‫ػ‬ೳ͔Ͳ͏͔ɺ໌ྎʹͳΔ // これらの機能は、関連している? struct String { init(_ value: Int) { … } init(_ value: Int, radix Int) { … } } // 既定値を使えば、関連性を気にする必要さえない。 struct String { init(_ value: Int, radix Int = 10) { … } }

60.

ఆٛΛ΋ͬͱચ࿅͢Δ ໭Γ஋͚ͩͰͷPWFSMPBE͸͠ͳ͍ ⾣ ໊લ͕ಉ͡Ͱɺ໭Γ஋͕ҧ͏‫ػ‬ೳΛ࡞ΕΔ͕ʜ ⾣ ‫ܕ‬ਪ࿦ͰᐆດʹͳΔͨΊɺ࢖༻͠ͳ͍ // 指定したキーに対する値を更新する。 struct Variant { func value() -> Int func value() -> Double } *NQSFTTJPO ‫ݸ‬ਓతʹ͸BTͰεϚʔτʹ੾Γସ͑ΒΕΔͷ͕޷Έͩͬͨ ⾣ VOTBGF#JU$BTU͸ɺҾ਺Ͱl໭Γ஋ͷ‫ܕ‬zΛड͚औΔ࡞Γ ⾣

61.
[beta]
ఆٛΛ΋ͬͱચ࿅͢Δ

େҬؔ਺ΑΓ΋ϝιουΛ࢖͏
⾣ ϝιουͳΒɺॴଐͰҙຯ͕໌ྎʹͳΔ
⾣ ॴଐ͕ͳ͍ͱ͖΍‫׳‬शతʹద੾ͳΒɺେҬؔ਺Λ࢖͏

// 配列の並び替えた値、と表現できる。

struct Array<Element> {
func sorted() -> Array<Element> { … }
}
// 所属が定まらない場合に、大域関数として扱う。

func max(_ x: Int, _ y: Int, _ z: Int)
// 数値の絶対値、所属はあっても abs(x) が慣習的。

func abs(_ x: Int) -> Int

62.

ఆٛΛ΋ͬͱચ࿅͢Δ ҙຯͷͳ͍ϥϕϧ໊͸লུ͢Δ ⾣ ϥϕϧ໊ʹҙຯ͕ͳ͚Ε͹লུ͢Δ ⾣ ؔ਺Λ࢖͏ࢹ఺ʹཱͭͱɺ൑அ͠΍͍͢ // もはや x, y, z は、どうでもいい。 let answer = max(x: 3, y: 5, z: 2) // 慣習的に abs(x) な書き方が自然。 let answer = abs(value: -30) 1PJOU Ҿ਺Λର౳ʹѻ͏ؔ਺Ͱɺϥϕϧ໊͕ෆཁʹͳΔ ⾣ ϥϕϧ͕ͳͯ͘΋ɺ‫׳‬शతʹҙຯ͕Θ͔Δ৔߹΋ಉ༷ ⾣

63.
[beta]
ఆٛΛ΋ͬͱચ࿅͢Δ

δΣωϦοΫಛ༗ͷᐆດੑʹ஫ҙ
⾣ ‫ܕ‬Ҿ਺͕ܾ·ͬͨ‫Ͱޙ‬ɺᐆດʹͳΔ͜ͱ͕͋Δ

// Element = Any で束縛すると…

struct Array<Element> {
// element に [Any] が渡せる。

mutating func append(_ element: Element) { … }
// elements に [Any] が渡せる。

}

mutating func append<S:Sequence>(_ elements: S)
where S.Iterator.Element == Element { … }

1PJOU

‫ʹऀޙ‬ϥϕϧlDPOUFOUT0GzΛ෇͚ͯճආ͢Δ
⾣ ҙຯతʹ"QQFOETUIFDPOUFOUTPGbFMFNFOUT`UPUIFFOE
⾣

64.

ಡΈखʹͱͬͯ༏͍͠ίʔυʹͳΔ ‫׳‬Ε͖ͯͨΒ௅ઓ͍ͨ͠ɺ࣍ͷεςοϓ

65.

͓·͚ ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ

66.

ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ 4XJGUҎ͚߱ͩͰ࢖͏ίʔυΛॻ͘ #if swift(>=3.0) // Swift 3.0 以上でコンパイルするコード #else // Swift 3.0 未満でコンパイルするコード #endif 4XJGUҎ্Ͱ࢖͑Δ

67.

ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ ؔ਺໊ͷมߋΛଅ͢ 4XJGUͷॻࣜͰఆٛ // 新しい名前に変更する。 mutating func formUnion() { … } // 旧名称を定義、名前の変更を明記する。 @available(*, unavailable, renamed: "formUnion") mutating func unionInPlace() { /* 実装不要 */ }

68.
[beta]
ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ

ؔ਺໊ͷมߋΛଅ͢ʢҾ਺Λߟྀʣ
4XJGUͷॻࣜͰఆٛ

// 新しい名前に変更する。

func advanced(by amount: Int) -> Int { … }
// 旧名称を定義、名前の変更を明記する。

@available(*, unavailable, renamed: "advanced(by:)")
func advancedBy(_ amount: Int) -> Never { /* 実装不要 */ }

69.

ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ ϓϩτίϧ໊ͷมߋΛଅ͢ 4XJGUͷॻࣜͰఆٛ // 新しい名前に変更する。 protocol Bookshelf { … } // 旧名称を型エイリアスで定義し、新しい型を設定する。 @available(*, unavailable, renamed: "Bookshelf") typealias BookshelfType = Bookshelf

70.

ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ ྻ‫ࢠڍ‬ͷมߋΛଅ͢ // 列挙子を、新しい名前に変更する。 enum DecodingResult { case scalarValue(UnicodeScalar) case emptyInput case error } // 列挙子は、自動で Fix-it の対象になる。

71.

৽‫໊Ͱچ‬લ͕িಥ͢Δͱ͖͸ʜʁ

72.

ΨΠυϥΠϯద༻Λࢧԉ͢Δ‫ػ‬ೳ ৽‫໊Ͱچ‬લ͕িಥ͢Δͱ͖͸ʜʁ // これを sorted に変えたい。 func sort() { … } // これを sort に変えたいが、旧 sort と衝突する。 mutating func sortInPlace() -> Cards { … }

73.

!TXJGU@NJHSBUJPO

74.

!TXJGU@NJHSBUJPO ‫چ‬ఆٛʹɺ৽໊͍͠લΛଐੑͰఴ͑Δ // 旧実装はそのまま、新しい名称を指定する。 @swift3_migration(renamed="sorted()") func sort() -> Cards { … } @swift3_migration(renamed="sort()") mutating func sortInPlace() { … } 4XJGUͷॻࣜͰఆٛ

75.

!TXJGU@NJHSBUJPO 5P-BUFTU4XJGU4ZOUBYΛ࣮ߦ͢Δ

76.

!TXJGU@NJHSBUJPO ͦΕͧΕ͕ద੾ʹஔ͖‫͑׵‬ΒΕΔ ⾣ ‫਺ؔچ‬TPSU*O1MBDF͕ɺ৽ؔ਺TPSUʹஔ͖‫׵‬ΘΔ ⾣ ‫਺ؔچ‬TPSU͕ɺ৽ؔ਺TPSUFEʹஔ͖‫׵‬ΘΔ

77.

ྻ‫ܕڍ‬΋ࣗಈϚΠάϨʔγϣϯ

78.

!TXJGU@NJHSBUJPO ‫ࣜܗچ‬ͷྻ‫͖ͱ͕ͨͬ͋ܕڍ‬ // 何もしなくても、マイグレーションの対象になる。 enum DecodingResult { case ScalarValue(UnicodeScalar) case EmptyInput case Error } func decode(source: String?) -> DecodingResult { … } 4XJGUͷॻࣜͰఆٛ

79.

!TXJGU@NJHSBUJPO 5P-BUFTU4XJGU4ZOUBYΛ࣮ߦ͢Δ

80.

!TXJGU@NJHSBUJPO ྻ‫͕ࢠڍ‬-PXFS$BNFM$BTFʹͳΔ ⾣ ྻ‫ࢠڍ‬ͷఆ͕ٛɺࣗಈతʹม‫͞׵‬ΕΔ ⾣ ྻ‫ࢠڍ‬Λ࢖͍ͬͯΔՕॴ΋ɺม‫͞׵‬ΕΔ

81.

·ͱΊ

82.

4XJGU"1*%FTJHO(VJEFMJOFT ·ͱΊ ⾣ ӳจΛΠϝʔδͯ͠ॻ͖·͠ΐ͏ ⾣ Ҿ਺ϥϕϧͷ࢖͍ํ͕‫ݟ‬௚͞Εͨ ⾣ ৔໘͝ͱͷ໋໊ํ๏͕ࣔ͞Εͨ ⾣ ‫ط‬ଘίʔυ΁ͷӨ‫ڹ‬ൣғ͸େ͖͍ ⾣ ౷Ұ‫ͯͰ͕ײ‬ɺಡΈ΍͘͢ͳΔ ⾣ ࢦ਑͕Ͱ͖ɺॻ͘ͱ͖ͷ೰Έ͕ܰ‫ݮ‬

83.

ૉఢͳ"1*Λɺॻ͖·͠ΐ͏

84.

&OKPZ4XJGU 5IBOLZPV 4XJGUΛॻ͘ͱ͖ʹ஌͓͖͍ͬͯͨ "1*%FTJHO(VJEFMJOFT &;/&5‫۽‬୩༑޺ IUUQF[OFUKQ ⾣ ίϝϯτΛॻ͘ ⾣ ໊લ෇͚ͷ‫ج‬ຊ ⾣ ໊લ෇͚ͷ‫׳‬श ⾣ ఆٛΛ΋ͬͱચ࿅͢Δ ⾣ !TXJGU@NJHSBUJPO