WWDC 旅行の余談と Swift Open Hours 3 - Swift ラボで聞いてきた話 #cocoa_kansai

124 Views

July 09, 16

スライド概要

WWDC16 の Swift ラボで聞いてきた話から2つをピックアップして、第68回 Cocoa 勉強会関西 で紹介してきました。

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

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

4XJGU0QFO)PVST %FWFMPQFS5PPMT-BC" !88%$ /* 2016.07.09 @ 第68回 Cocoa 勉強会関西 */ &;/&5‫۽‬୩༑޺ 4XJGU1SFWJFX IUUQF[OFUKQ

2.

‫۽‬୩༑޺ /* @es_kumagai */ 5PNPIJSP,VNBHBJ /** */ ⾣ 4XJGU‫͕ޠݴ‬௒େ޷͖Ͱ͢ʂ ⾣ ΈΜͳͰָ͠Ήษ‫ڧ‬ձ͕େ޷͖Ͱ͢ʂ ⾣ ษ‫ڧ‬ձͰൃද͢Δͷ͕ͱͬͯ΋޷͖Ͱ͢ʂ ⾣ ॻ੶9DPEFపఈղઆॻ͖·ͨ͠ɻ ⾣ ٕज़ϒϩά&;/&5Λॻ͍ͨΓͯ͠·͢ɻ

3.

ษ‫ڧ‬ձΛ։࠵ͯ͠·͢ɻ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ DTXJGU !ԣ඿ɾ੨༿୆ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕໨తͷձ ΏΔ͘ΈΜͳͰ4XJGU‫͍ͯͭʹޠݴ‬ ‫ޠ‬Β͑Δ৔͕ཉͯ࢝͘͠Ίͨձ ୈ̍̌ճ͸։࠵༧ఆ /** ‫͍ئ‬ J04΍4XJGUͷษ‫ڧ‬ձΛ։࠵ͯ͠·͢ɻ ҆৺ͯ͠ஊٛʹՖΛ࡙͔ͤΒΕ·͢Α͏ʹɻ */

4.

@niwatako͞Μʹ ໋Λ‫ٹ‬ΘΕͨ࿩

5.

Ή͔͠Ή͔͠ɺւͷ޲͜͏Ͱ

6.

8 8 %$ /* 2016/06/13  2016/06/17 */ ͱ͍͏ɺ͍ͨͦ͏͓ߴ͍ Πϕϯτ͕‫ܭ‬ը͞Ε͍ͯͨͦ͏ͳ

7.

ӈ্ʹ͋ͬͨ3FHJTUFSϘλϯΛɺ ԡͯ͠ΈΔͱ

8.

ͳΜͱɺ ܾࡁ͞Εͨ͡Όͳ͍Ͱ͔͢

9.

͜͏ͯ͠ࢲ͸ɺ 4BO'SBODJTDP΁ෝ͘͜ͱʹͳͬͨͷͰ͢

10.

͔͠͠

11.

ࢲʹͱͬͯ͸ɺॳͷւ֎

12.

ւ֎΁ߦͬͨΒ ੜ͖ͯ‫ͯͬ͜ؼ‬ΕΔ‫͍ͳ͕͠ؾ‬

13.

Ͱ΋ɺ‫ʹޙ‬͸΋͏Ҿ͚·ͤΜ

14.

༻ҙप౸ʹ४උΛਐΊʜ ग़ൃલ೔ͷ༷ࢠ ߤ࿏ͱ ॓ധ஍ͷܾఆ ӳ‫ޠ‬ ӳ‫ֶޠ‬श Ͱ͖ͳ͍ ·ͩʂ ‫ݥة‬஍ଳͷ ༧श ਐḿθϩʂ ௒Φϫλ ʘ ?P? ʗ ඞཁͳ࣋෺ ͷ४උ ՙ଄Γ 4XJGUֶश ΧδϡΞϧ 4XJGUษ‫ڧ‬ձ ଟ͍ʂ ؒʹ߹Θͳ͍ʂ ग़ൃલ೔ʹ ษ‫ڧ‬ձΛ։࠵ʂ

15.

ւ֎ରԠ4*.Λ࣋ͬͯɺ౉ߤ

16.

౸ண ͔͠͠

17.

·͔͞ͷɺ‫֎ݍ‬ Ͳ͏͕͍͋ͯ΋‫͕ܨ‬Γ·ͤΜ

18.

ਓੜɺఘΊ͔͚ͨͦͷॠؒ

19.

ਆɺ߱ྟ

20.

࣮͸ཁΒͳ͔͚ͬͨͲɺ‫ʹ͍࣌ͨ෇ؾ‬͸Ωϟϯηϧྉ͔ͩͬͨΒआΓ͖ͯͨ 8J'JϧʔλʔΛ̍೔ɺत͚·͠ΐ͏

21.

͜͏ͯ͠ࢲ͸ɺҟࠃͷ஍Ͱ ੜ͖௕Β͑Δ͜ͱ͕Ͱ͖·ͨ͠

22.

!OJXBUBLP ͞Μ͸ ਆ

23.

͔͠͠ɺ҆৺ͯ͠͸͍ΒΕ·ͤΜ ໌೔ʹ͸ฦ͞ͳ͚Ε͹͍͚ͳ͍ͷͰ͢

24.

‫ݱ‬஍Ͱ4*.Λௐୡ͠Α͏

25.

͚ΕͲ΋ෆཱ͕҆ͪ͸͔ͩΓ·͢ ӳ‫ޠ‬Λ஻Εͳͯ͘΋ങ͑Δͷ͔ɺͱ

26.

ళΛ‫͚ͭݟ‬ɺೖΕ͹͙͢͞·ళһ͞Μ͕ʜ ΋͸΍ɺ‫׬‬શෆՄආ

27.

ࢲ ళһ ˓˞˛ʁ˖– ʜ4*. 0,˞˛ʂ˕– ଺ࡏ೔਺Λฉ͍͍ͯΔΑ͏ͩʜ ʜEBZT 0,˚˞ˑ˓˘ ͜ͷϓϥϯͰྑ͍͔ฉ͍͍ͯΔΑ͏ͩʜ ʜ1MFBTF 0, ʜ5IBOLZPV

28.

͍͍ͷ͔ʁ͜ΕͰʜ

29.

͜͏ͯ͠ɺແࣄʹ4*.ΛखʹೖΕ 8J'JϧʔλʔΛฦ͢͜ͱ͕Ͱ͖·ͨ͠ͱ͞

30.

ΊͰͨ͠ΊͰͨ͠

31.

8 8 %$ /* 2016/06/13  2016/06/17 */

33.

88%$ ͍ͪ͹Μָ͠Έʹ͍ͯͨ͠ηογϣϯ

34.

͍ͪ͹Μָ͠Έʹ͍ͯͨ͠ηογϣϯ 8IBU`T/FXJO4XJGU

35.

88%$ ͍ͪ͹Μָ͔ͬͨ͜͠ͱ

36.

%FWFMPQFS5PPMT-BC" 4XJGU0QFO)PVST

37.

4XJGU0QFO)PVST ϥϘͰ࣭໰ͨ͜͠ͱ  ྻ‫͕ࢠڍ‬-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝͸ʁ  !TXJGU@NJHSBUJPOଐੑͷ࢖͍ํΛ஌Γ͍ͨ  *60ଐੑ͸ೖΕࢠʹͰ͖ͳ͍͸ͣͳͷʹ ೖΕࢠʹͰ͖Δ৔߹͕͋Δͷ͸ͳͥʁ  $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝͸ʁ  TPVSDF-PDBUJPOͱpMF͸࿈ಈ͠ͳ͍΋ͷʁ  ETPIBOEMF͸࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏࢖͏ͷ͔  ͳͥEFGFS಺Ͱએ‫ݴ‬લͷม਺͕࢖͑Δͷ͔  !DPOWFOUJPOͷ༻్Λ΋͏গ͠ৄ͘͠஌Γ͍ͨ  ධՁࣜʹର͢ΔTFMG͸Ͳ͏͍͏ޮՌ͕͋Δͷ͔  ‫ʹܕ‬ର͢ΔTFMGΛলུͰ͖Δ৔߹͕͋Δͷ͸ͳͥʁ  !XBSO@VOVTFE@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝͸ʁ

38.

4XJGU0QFO)PVST ͦ͜ͰਘͶͨ͜ͱΛ̎ͭ঺հ

39.

$PMMFDUJPOͰJOEFY BGUFS ͕ ඞਢʹͳͬͨཧ༝

40.

$PMMFDUJPO͕ཁ‫͢ٻ‬Δ΋ͷ 4XJGUͰ$PMMFDUJPO5ZQFΛద༻ ⾣ ࠷௿‫*ݶ‬OEFYBCMFϓϩτίϧʹ४‫ڌ‬ ⾣ ඞਢͷ࣮૷͸̏ͭ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } 4XJGUY

41.

$PMMFDUJPO͕ཁ‫͢ٻ‬Δ΋ͷ 4XJGUͰ$PMMFDUJPOΛద༻ ⾣ ࠷௿‫*ݶ‬OEFYBCMF#BTFϓϩτίϧʹ४‫ڌ‬ ⾣ ඞਢͷ࣮૷͸̐ͭ // 最初のインデックス var startIndex: Index { get } // 最後の次のインデックス var endIndex: Index { get } // 指定したインデックスに該当する要素 subscript (position: Index) -> _Element { get } // あるインデックスの次のインデックスを取得 func index(after i: Index) -> Index 4XJGU1SFWJFX

42.

GVODJOEFY BGUFSJ*OEFY *OEFY ͳͥɺٛ຿͚ͮΒΕͨͷ͔

43.

*OEFYBCMFʹ஫໨

44.

*OEFYBCMFʹ஫໨ 4XJGUͷ*OEFYBCMF ⾣ *OEFYͱͯ͠'PSXBSE*OEFY5ZQFΛ૝ఆ ⾣ ࡧҾ༻ͷৼΔ෣͍Λ࣋ͭ‫ࡧͰܕ‬ҾΛද‫ݱ‬ protocol Indexable { associatedtype Index : ForwardIndexType } 4XJGUY

45.

*OEFYBCMFʹ஫໨ 4XJGUͷ*OEFYBCMF ⾣ *OEFYͱͯ͠$PNQBSBCMFΛ૝ఆ ⾣ ࡧҾ͸ൺֱͰ͖Ε͹ྑ͍ protocol Indexable : IndexableBase { } protocol IndexableBase { associatedtype Index : Comparable } 4XJGU1SFWJFX

46.

*OEFYʹ஫໨

47.

*OEFYʹ஫໨ Ҏલ͸*OEFYࣗମ͕ҠಈੑΛද‫͢ݱ‬Δ ⾣ લํҠಈɺ‫ํޙ‬ҠಈɺϥϯμϜΞΫηε ⾣ *OEFY5ZQF͕ ৼΔ෣͍Ͱ ҠಈੑΛൃ‫ݱ‬ protocol ForwardIndexType { func successor() -> Self } protocol BidirectionalIndexType : ForwardIndexType { func predecessor() -> Self } /* 継承関係を簡略化して記載しています */ 4XJGUY

48.

*OEFYʹ஫໨ Ҏ‫ޙ‬͸*OEFYࣗମ͕ҠಈੑΛද‫͍ͳ͠ݱ‬ ⾣ ද‫͞ݱ‬ΕΔͷ͸ൺֱੑ͚ͩ ⾣ *OEFY͸஋ʹઐ೦ɻҠಈੑ·Ͱ͸ൃ‫͍ͳ͠ݱ‬ protocol Comparable : Equatable { } 4XJGUY

49.

*OEFYʹ஫໨ Ҡಈੑ͸*OEFYBCMFͰද‫͢ݱ‬Δ ⾣ 4XJGUͰ͸ɺൣғੑͱΞΫηεੑ ⾣ 4XJGU͸Ճ͑ͯ Ҡಈੑ ͕ඞཁʹͳͬͨ protocol Indexable { var startIndex: Index { get } var endIndex: Index { get } subscript (position: Index) -> _Element { get } func index(after i: Index) -> Index } 4XJGU1SFWJFX

50.

ͭ·Γ

51.

4XJGUͷ$PMMFDUJPO JOEFY BGUFS ͕ඞཁʹͳͬͨཧ༝ ⾣ *OEFY͸஋ද‫ʹݱ‬ઐ೦ʁҠಈੑ͸࣋ͨͳ͍ ⾣ ୅ΘΓʹ*OEFYBCMFͰҠಈੑΛද‫ݱ‬ʁ protocol Indexable { associatedtype Index : Comparable var startIndex: Index { get } var endIndex: Index { get } subscript (position: Index) -> _Element { get } func index(after i: Index) -> Index } 4XJGU1SFWJFX

52.

͋ͬͯΔʁ ͨͿΜɺ͋ͬͯΔɻ

53.

Swift Lab で聞いてみた!

54.

$PMMFDUJPOͷ࠶ઃ‫ܭ‬

55.

$PMMFDUJPOͷ࠶ઃ‫ܭ‬ 4XJGUͷίϨΫγϣϯ ⾣ $PMMFDUJPO͕ूੵੑΛද‫ݱ‬ ⾣ 'PSXBSE*OEFY5ZQF #JEJSFDUJPOBM*OEFY5ZQF  3BOEPN"DDFTT*OEFY5ZQFͰҠಈੑΛද‫ݱ‬ // 前方移動性をもつ索引型 protocol ForwardIndexType: Equatable // 前後方移動性をもつ索引型 protocol BidirectionalIndexType: ForwardIndexType // どこへも自由に即時移動できる索引型 protocol RandomAccessIndexType: BidirectionalIndexType // コレクションは集積性と、使用する索引を規定 protocol CollectionType { associatedtype Index : ForwardIndexType 4XJGUY

56.

$PMMFDUJPOͷ࠶ઃ‫ܭ‬ 4XJGUͷίϨΫγϣϯ ⾣ $PMMFDUJPO͕ूੵੑͱҠಈੑΛද‫ݱ‬ ⾣ $PMMFDUJPO #JEJSFDUJPOBM$PMMFDUJPO  3BOEPN"DDFTT$PMMFDUJPOͰ૯‫ׅ‬తʹද‫ݱ‬ // 前方移動性をもつコレクション protocol Collection: Indexable // 前後方移動性をもつコレクション protocol BidirectionalCollection: BidirectionalIndexable // 範囲内を自由に即時移動できるコレクション protocol RandomAccessCollection: RandomAccessIndexable // インデックスに求められるのは比較性のみ protocol Collection { associatedtype Index : Comparable 4XJGU1SFWJFX

57.

$PMMFDUJPOͷ࠶ઃ‫ܭ‬ ࠶ઃ‫ܭ‬ͷཁ఺ ⾣ ίϨΫγϣϯ͕ҠಈੑΛओମతʹද‫ݱ‬ ⾣ ࡧҾ͸ಛผࢹͤͣɺൺֱՄೳͳ஋Ͱ͋Δ͜ͱ // このコレクションは前後へ移動可能 struct MyCollection : BidirectionalCollection { // 索引として文字列を使う typealias Index = String } 4XJGU1SFWJFX

58.

$PMMFDUJPOͷ࠶ઃ‫ܭ‬ ࠶ઃ‫ܭ‬ͷޮՌ ⾣ l࣍zͷ֓೦͕͋ΔࡧҾͷ$PMMFDUJPO͸ෳࡶʹ ⾣ l࣍z͕$PMMFDUJPOʹґଘ͢Δ࣮૷͸؆ུԽ // Int を索引にもつデータ表現は実装の手間が増える struct MyArray<Element> : RandomAccessCollection { typealias Index = Int } // String を索引にもつデータ表現は簡略化される struct Namelist : Collection { typealias Index = String 4XJGU1SFWJFX

59.

·ͱΊ ࣮૷ͷ؆ུԽͱཧ۶ͷඒ͠͞ όϥϯεΛऔΓͭͭɺ࠶ઃ‫ܭ‬

60.

࣮ʹඒ͍͠ʜ

61.

!XBSO@VOVTFE@SFTVMU͕ 1MBZHSPVOEͰޮ͔ͳ͍ཧ༝

62.
[beta]
!XBSO@VOVTFE@SFTVMU

֓ཁ
⾣

ؔ਺΍ϝιουʹ෇༩͢Δଐੑ

⾣

໭Γ஋Λ࢖Θͳ͔ͬͨͱ͖ʹ‫͢ࠂܯ‬Δ

@wran_unused_result
func calculate(values: Int...) -> Int { … }
// 普通は変数に受ける

let answer = calculate(1, 2, 3)
// 変数に受けないと警告になる

calculate(1, 2, 3)

SFTVMUPGDBMMUP
DBMDVMBUFJTVOVTFE

// 変数に受けたくないときは、明示的に破棄する

_ = calculate(1, 2, 3)
4XJGUY

63.
[beta]
!XBSO@VOVTFE@SFTVMU

4XJGU͔Β͸‫ط‬ఆͰ‫ࠂܯ‬
⾣

‫ط‬ఆͰ!XBSO@VOVTFE@SFTVMU͕෇༩

⾣

‫ڐ‬Մ͢Δͱ͖͸!EJTDBSEBCMF3FTVMUΛ໌‫ه‬

// この書き方で、戻り値を使わないと警告

func calculate(values: Int...) -> Int { … }
// 戻り値を使わなくて良いことを許可したい場合

@discardableResult
func apply(effect: Effect) -> Image { … }

4XJGU1SFWJFX

64.

1MBZHSPVOEͰ‫͞ࠂܯ‬Εͳ͍

65.
[beta]
1MBZHSPVOEͰ‫͞ࠂܯ‬Εͳ͍

ͳͥɺ‫͞ࠂܯ‬Εͳ͍ͷ͔ʁ
⾣

1MBZHSPVOE͕݁Ռදࣔʹ࢖͏͔Βʁ

⾣

ͦ͏͍͑͹ࢀরؔ܎΋‫ڍ‬ಈ͕ҧͬͨΑ͏ͳʁ

@wran_unused_result
func calculate(values: Int...) -> Int { … }
// 普通は変数に受ける

let answer = calculate(1, 2, 3)
// Playground だと警告にならない

calculate(1, 2, 3)

4XJGUY

66.

Swift Lab で聞いてみた!

67.

1MBZHSPVOEͰ‫͞ࠂܯ‬Εͳ͍ ͳͥɺ‫͞ࠂܯ‬Εͳ͍ͷ͔ʂ ⾣ 1MBZHSPVOE͕݁Ռදࣔʹ࢖͏͔Βʂ ⾣ 1MBZHSPVOEઐ༻ͷಈ࡞Ϟʔυ͕͋ΔΒ͍͠ // このようなコードが自動生成される(喩え) let tmp = getValue() print(tmp) 4XJGUY

68.

·ͱΊ 1MBZHSPVOE͸ઐ༻ϞʔυͰಈ࡞ ௨ৗϞʔυͱҟͳΔ‫ڍ‬ಈΛࣔ͢͜ͱ΋

69.

4XJGUಛघϞʔυʁ ͥΜͥΜ෼͔Βͳ͍ͳΓʹࢼͯ͠ΈΔʜ͕ʂ ϦϯΧ·ΘΓʹૄ͘ɺͻͱ·్ͣதஅ೦

70.

4XJGUಛघϞʔυ 1MBZHSPVOEϞʔυΛࢼΈΔʜ ⾣ ϑϩϯτΤϯυΛ1MBZHSPVOEʹࢦఆ ⾣ TXJGUD9GSPOUFOEQMBZHSPVOEGJMFTXJGU // ただし、この段階では実行時エラー use of unresolved identifier '$builtin_log_with_id' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_entry' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_scope_entry' use of unresolved identifier '$builtin_log_scope_exit' use of unresolved identifier '$builtin_log_with_id' 4XJGUY

71.

4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNF ⾣ 1MBZHSPVOET3VOUJNF͕ඞཁ IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET

72.

4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNFΛϏϧυʜ ⾣ DEMMECQBDLBHFT1ZUIPOMMECTVJUFUFTUMBOH  TXJGUQMBZHSPVOET ⾣ NBLFMJC1MBZHSPVOET3VOUJNFEZMJC IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET

73.

4XJGUಛघϞʔυ ࣮ߦϑΝΠϧΛϏϧυͯ͠ΈΔʜ ⾣ TXJGUD 9GSPOUFOEQMBZHSPVOE  FNJUPCKFDUpMFTXJGU ⾣ TXJGUDMJC1MBZHSPVOET3VOUJNFEZMJCpMFP ⾣ NBJO ͜ΕͰ͍͍ͷ͔ʜΘ͔Βͳ͍ IUUQTHJUIVCDPNBQQMFTXJGUMMECUSFFNBTUFS QBDLBHFT1ZUIPOMMECTVJUFUFTUMBOHTXJGUQMBZHSPVOET

74.

4XJGUಛघϞʔυ 1MBZHSPVOET3VOUJNF ⾣ ͍͔ͭ͘ͷ‫ػ‬ೳ͕༻ҙ͞Ε͍ͯΔ ⾣ ͜ΕΛ࢖͑ΔΑ͏ʹ͢Δʹ͸ʜʁ @_silgen_name ("playground_log_scope_entry") func builtin_log_scope_entry(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("playground_log_scope_exit") func builtin_log_scope_exit(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("playground_log_postprint") func builtin_postPrint(_:,_:,_:,_:) -> AnyObject? @_silgen_name ("DVTSendPlaygroundLogData") func builtin_send_data(_ object:AnyObject?) { @_silgen_name ("GetOutput") func get_output() -> String

75.

Ͳͳ͔ͨɺ‫͍ͩͯ͑͘͞ڭ‬ʂ N @@ N

76.

4XJGU0QFO)PVST ϥϘͰ࣭໰ͨ͜͠ͱ/* 再掲 */  ྻ‫͕ࢠڍ‬-PXFS$BNFM$BTFʹͳͬͨ۩ମతͳཧ༝͸ʁ  !TXJGU@NJHSBUJPOଐੑͷ࢖͍ํΛ஌Γ͍ͨ  *60ଐੑ͸ೖΕࢠʹͰ͖ͳ͍͸ͣͳͷʹ ೖΕࢠʹͰ͖Δ৔߹͕͋Δͷ͸ͳͥʁ  $PMMFDUJPOͰJOEFY BGUFS ͕ඞਢʹͳͬͨཧ༝͸ʁ  TPVSDF-PDBUJPOͱpMF͸࿈ಈ͠ͳ͍΋ͷʁ  ETPIBOEMF͸࣮ߦ࣌ΤϥʔʹͳΔ͕ɺͲ͏࢖͏ͷ͔  ͳͥEFGFS಺Ͱએ‫ݴ‬લͷม਺͕࢖͑Δͷ͔  !DPOWFOUJPOͷ༻్Λ΋͏গ͠ৄ͘͠஌Γ͍ͨ  ධՁࣜʹର͢ΔTFMG͸Ͳ͏͍͏ޮೳ͕͋Δͷ͔  ‫ʹܕ‬ର͢ΔTFMGΛলུͰ͖Δ৔߹͕͋Δͷ͸ͳͥʁ  !XBSO@VOVTFE@SFTVMU͕1MBZHSPVOEͰޮ͔ͳ͍ཧ༝͸ʁ

77.

88%$ ͱͬͯ΋ָ͍͠

78.

Έͳ͞Μ΋ɺͥͻ࣍ճࢀՃͯ͠ ଘ෼ʹ-BCΛຬ٤ͯ͠Έ͍ͯͩ͘͞ʂ

79.

Enjoy! Swift /* Thank you */