プロトコル指向 - 夢と現実の狭間 #cswift

-- Views

September 04, 16

スライド概要

Swift 3.0 で、廃止される BooleanType と、強化される FloatingPoint と。それらを見たときに感じた衝撃。その事実を観察しながら、実際の様子、感じたこと、これからのこと。そんなことを綴った発表資料です。

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

profile-image

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

シェア

またはPlayer版

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

ダウンロード

関連スライド

各ページのテキスト
1.

1SPUPDPM0SJFOUFE1SPHSBNNJOH ເͱ‫࣮ݱ‬ͷ‫ؒڱ‬ ୈճΧδϡΞϧ4XJGUษ‫ڧ‬ձPO &;/&5‫۽‬୩༑޺ IUUQF[OFUKQ 4XJGU%FWFMPQFS1SFWJFX

2.

4XJGUͷมߋ఺ΛோΊ͍ͯͨ

3.

ͦΜͳதͰग़ձͬͨিܸͷग़དྷࣄ

4.

#PPMFBO5ZQFͷফ໓ struct Variant : BooleanType { }

5.

'MPBUJOH1PJOUͷෳࡶԽ QSPUPDPM'MPBUJOH1PJOU$PNQBSBCMF &YQSFTTJCMF#Z*OUFHFS-JUFSBM  4JHOFE/VNCFS "CTPMVUF7BMVBCMF 4USJEFBCMF\ BTTPDJBUFEUZQF&YQPOFOU4JHOFE*OUFHFS JOJU TJHO'MPBUJOH1PJOU4JHO FYQPOFOU4FMG&YQPOFOU TJHOJGJDBOE4FMG  JOJU TJHO0G4FMG NBHOJUVEF0G4FMG  TUBUJDWBSSBEJY*OU\HFU^ TUBUJDWBSOBO4FMG\HFU^ TUBUJDWBSTJHOBMJOH/B/4FMG\HFU^ TUBUJDWBSJOGJOJUZ4FMG\HFU^ TUBUJDWBSHSFBUFTU'JOJUF.BHOJUVEF4FMG\HFU^ TUBUJDWBSQJ4FMG\HFU^ WBSVMQ4FMG\HFU^ TUBUJDWBSVMQ0G0OF4FMG\HFU^ TUBUJDWBSMFBTU/PSNBM.BHOJUVEF4FMG\HFU^ TUBUJDWBSMFBTU/PO[FSP.BHOJUVEF4FMG\HFU^ WBSTJHO'MPBUJOH1PJOU4JHO\HFU^ WBSFYQPOFOU4FMG&YQPOFOU\HFU^ WBSTJHOJGJDBOE4FMG\HFU^ GVODBEEJOH @PUIFS4FMG 4FMG

6.

ഭΓ‫د‬Δ*OUFHFSͷߴ૚Խ

7.

ϓϩτίϧͬͯ ⾣ ΋ͬͱந৅తͳ֓೦Λɺද‫͢ݱ‬Δͱࢥͬͯͨɻ ⾣ ՄೳੑΛγϯϓϧʹɺද‫͢ݱ‬Δͱࢥͬͯͨɻ

8.

ϓϩτίϧͷੈքɺͲ͏ͳͬͪΌ͏ͷʁ

9.

ந৅Խ ۩৅Խ ເͱ‫࣮ݱ‬ͷ‫ؒڱ‬ #PPMFBO5ZQF 'MPBUJOH1PJOU *OUFHFS

10.

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

11.

ษ‫ڧ‬ձΛ։࠵͍ͯ͠·͢ɻ Θ͍Θ͍ɺָ͘͠ɺ ΈΜͳͰ‫ޠ‬Β͑Δ৔ॴΛ໨ࢦͯ͠ɻ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΈΜͳͰ4XJGU ෮शձ ZJEFW ˏԣ඿ɾഅंಓ NJOOB@EF@TXJGU ˏौ୩ ୈճ໨͸݄೔ͷ։࠵ʢ໨ඪʣ ୈճ໨Λ݄೔ʹ։࠵ʢ‫ݕ‬౼ʣ IUUQTBUOEPSHHSPVQTZJEFW IUUQDTXJGUDPOOQBTTDPN

12.

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

13.

$PEF1JFDFGPSNBD04 ษ‫ڧ‬ձΛָ͠ΉΞϓϦ ⾣ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌౤ߘ ⾣ ίʔυཝΛۭʹ͢Ε͹ɺී௨ʹπΠʔτՄೳ ⾣ ϋογϡλάΛઃఆͰ͖Δʗ෇͚๨Εͳ͍ #cswift

14.

#PPMFBO5ZQFͷফ໓ 4&

15.

#PPMFBO5ZQFͷফ໓ #PPMFBO5ZQFϓϩτίϧJO4XJGU ⾣ ਅِ஋Λද‫͢ݱ‬Δϓϩτίϧ ⾣ 4XJGUͰ͸ɺద༻ͨ͠‫ܕ‬͸JGͷධՁ஋ʹ࢖͑ͨ protocol BooleanType { var boolValue: Bool { get } } // 適用した型は、そのまま condition として使える let value = MyValue() if value { }

16.

#PPMFBO5ZQFͷফ໓ #PPMFBO5ZQFϓϩτίϧJO4XJGU ⾣ 4XJGU͔Β#PPMFBO5ZQFϓϩτίϧഇࢭ ⾣ JGͳͲͷධՁ஋ʹ࢖͑Δͷ͸#PPMͷΈ // protocol BooleanType { // var boolValue: Bool { get } // } // Bool 以外は condition に使えない let value = MyValue() if value { } b.Z#PPM`JTOPUDPOWFSUJCMFUPb#PPM`

17.

#PPMFBO5ZQFͷফ໓ ഇࢭͷཧ༝ ⾣ ਅِ஋ͷந৅Խ͸ෳࡶ͞Λট͘ ⾣ େ఍ͷ"1*Ͱ#PPMFBO5ZQFͰ͸ͳ͘#PPMΛ૝ఆ // こんな風に API を書いてましたか? func removeAll<T: BooleanType>(keepCapacity: T) { } // こう書いていませんでしたか? func removeAll(keepCapacity: Bool) { }

18.

#PPMFBO5ZQFͷফ໓ ඪ४ϥΠϒϥϦͰͷࣄྫ ⾣ ඪ४ϥΠϒϥϦͰ΋ɺ΄ͱΜͲ࢖ΘΕͳ͔ͬͨ ⾣ ԋࢉࢠ  cc͚ͩͰ࢖ΘΕ͍ͯͨ prefix func !<T : BooleanType>(a: T) -> Bool func &&<T : BooleanType, U : BooleanType> (lhs: T, @autoclosure rhs: () -> U) -> Bool func ||<T : BooleanType, U : BooleanType> (lhs: T, @autoclosure rhs: () -> U) -> Bool

19.

#PPMFBO5ZQFͷফ໓ ந৅Խͷඞཁੑ͕‫ݮ‬গ ⾣ #PPM 0CK$#PPM $#PPM͕͋ͬͨ ⾣ 0CKFDUJWF$*OUFSPQFSBCJMJUZͷൃୡͰ#PPM͕ओྲྀʹ // 普通は Bool 型しか受け取らない // ObjCBool を受け取ったら boolValue で Bool 値を取得 if objcBool.boolValue { } // ちなみに CBool は Bool の型エイリアス typealias CBool = Bool

20.

ഇࢭܾఆ

21.

#PPMFBO5ZQFͷফ໓ ഇࢭํ๏ ⾣ #PPMFBO5ZQFϓϩτίϧΛ#PPM‫Ͱܕ‬௚઀ࢦఆ ⾣ Ө‫ڹ‬ൣғ͸ɺԋࢉࢠ  cc͚ͩ prefix func !(a: Bool) -> Bool func &&(lhs: Bool, @autoclosure rhs: () -> Bool) -> Bool func ||(lhs: Bool, @autoclosure rhs: () -> Bool) -> Bool

22.

#PPMFBO5ZQFͷফ໓ ഇࢭͷӨ‫ڹ‬ ⾣ JGͳͲͷධՁ஋ʹ#PPMҎ֎͸࢖͑ͳ͘ͳΔ ⾣ 0CK$#PPM΋CPPM7BMVFϓϩύςΟͷ࢖༻͕ඞਢʹ let condition: ObjCBool = true if condition.boolValue { }

23.

͜ΕͰΑ͔ͬͨͷ͔ͳʁ

24.

#PPMFBO5ZQFͷফ໓ CPPM7BMVF͸ɺ‫ن‬ఆ͞Εͳ͍ ⾣ #PPMΛऔಘ͢ΔCPPM7BMVF͸ɺ‫͕ࣗܕ‬ओతʹ࣋ͭ ⾣ ϓϩτίϧͰͷ‫ن‬ఆ͕ͳ͍ͱɺ൚༻Խ͠ʹ͍͘ʁ struct ObjCBool { var boolValue: Bool } // ジェネリックで使いたいときは…また作りますか? protocol Boolean { var boolValue: Bool } extension ObjCBool : Boolean { }

25.

#PPMFBO5ZQFͷফ໓ ਅِ஋ͷҙຯ͸ɺ‫ʹܕ‬Αͬͯҧ͏͔΋ ⾣ #PPMΛҙຯ͢Δද‫͕ݱ‬CPPM7BMVFͱ͸‫ݶ‬Βͳ͍ ⾣ ϓϩτίϧʹ‫ن‬ఆ͞Εͳ͍ͷ͸ɺޭΛ૗͢Δ͔΋ʁ // ともすると、真か偽を表現しそうな型 enum Result { case success case failure // これが boolValue だと『何が真か』考える間が発生 var isOK: Bool { … } }

26.

#PPMFBO5ZQFͷফ໓ 4XJGUZ+40/͸ɺͲ͏ରॲ͔ͨ͠ ⾣ #PPMFBO5ZQFͱ͍͑͹4XJGUZ+40/ ⾣ ୯७ʹ#PPMFBO5ZQFΛফͯ͠ରԠͷ‫ࠐݟ‬Έ // BooleanType 適用を廃止 extension JSON /* : BooleanType */ { // boolValue プロパティは存続 var boolValue: Bool { … } } // 判定は boolValue 必須だが、むしろ意味を汲みやすい? if json.boolValue { }

27.

'MPBUJOH1PJOUͷෳࡶԽ 4&

28.

ුಈখ਺఺਺

29.

'MPBUJOH1PJOUͷෳࡶԽ ුಈখ਺఺਺ Ծ਺ ࢦ਺ ‫਺ج‬ ⾣ খ਺఺਺Λද‫͢ݱ‬Δ࢓૊Έ ⾣ খ਺఺ͷҐஔΛಈత؅ཧ͢Δσʔλߏ଄ ⾣ Ծ਺ɾ‫਺ج‬ɾࢦ਺ͷ̏ͭͰද‫͢ݱ‬Δ ⾣ ແ‫ݶ‬େɾඇ਺஋Λද‫͖Ͱݱ‬Δ

30.

'MPBUJOH1PJOUͷෳࡶԽ ‫ج‬ຊಈ࡞ ⾣ ෳ਺ͷුಈখ਺఺਺‫͕͋ܕ‬Δ ⾣ ඇ਺஋/B/΍ɺແ‫ݶ‬େ*OpOJUZΛ૝ఆ // Double は倍精度浮動小数点数 (64 bit) let value: Double = 10.5 // Float は単精度浮動小数点数 (32 bit) let value: Float = 10.5 // 0.0 で割ると、無限大 value / 0.0 // inf // 表現しきれない値は、無限大 pow(35.0, 256.0) // inf

31.

'MPBUJOH1PJOUͷෳࡶԽ ඇ਺஋ʜRVJFU/B/ ⾣ ओʹɺ‫݁ࢉܭ‬Ռ͕਺ࣈͰ͸ͳ͍࣌ʹಘΒΕΔ ⾣ OBOʹԿΛ‫ͯ͠ࢉܭ‬΋OBOΛҡ࣋͢Δ // 数字にならない計算は、非数値 0.0 / 0.0 // nan // 非数値に演算しても、非数値 Double.nan + 10.0 // nan // 非数値を無限大で割っても、非数値 Double.nan / Double.infinity // nan // 負の非数値というのもある (-Double.nan).sign // minus

32.

'MPBUJOH1PJOUͷෳࡶԽ ඇ਺஋ʜTJHOBMJOH/B/ ⾣ ࢓্༷͸ɺ‫ʹ࣌ࢉܭ‬ΤϥʔΛ‫ݕ‬ग़Ͱ͖Δඇ਺஋ ⾣ ࢓্༷ͷɺΤϥʔ࣌ͷ‫ن‬ఆಈ࡞͸RVJFU/B/ѻ͍ // signaling NaN を計算すると quiet NaN Double.signalingNaN / 10.0 // quiet NaN // ただし signaling NaN * -1 なら維持 (Double.signalingNaN * -1).sign // minus

33.

'MPBUJOH1PJOUͷෳࡶԽ ແ‫ݶ‬େʜJOpOJUZ ⾣ ද͖͠Εͳ͍େ͖ͳ஋Λද‫ݱ‬ ⾣ ແ‫ݶ‬େ͸ɺಛผѻ͍ // 無限大から大きな値を引いても、無限大 Float.infinity - 1.0e+38 // inf // 最大値に十分な値を足すと、無限大 maxFloat + 1.0e+38 // inf // 最大値に小さな値を足しても、無限にはならない maxFloat + 1.0 // maxFloat // 一旦無限になると、辻褄が合わなくなることも maxFloat + 1.0e+38 - 1.0e+38 // inf

34.

'MPBUJOH1PJOUͷෳࡶԽ ແ‫ݶ‬େʜʶJOpOJUZ ⾣ Ͱׂͬͨͱ͖ͷ஋ද‫ʹݱ‬΋࢖͏ ⾣ ແ‫ݶ‬େͷ͓͔͛Ͱ×Λද‫͖Ͱݱ‬Δ // 正の方向から割ると、+∞ 1.0 / 0.0 // inf y // 負の方向から割ると、-∞ 1.0 / -0.0 // -inf O x // 浮動小数点数でないと // 表現できない 1 / 0 // ERROR y = 1/x

35.

ුಈখ਺఺਺ ͋·Γ‫͔ͨͬͳͯͬ࢖ͯ͠ʹؾ‬ʜ

36.

'MPBUJOH1PJOUϓϩτίϧ JO4XJGU

37.

'MPBUJOH1PJOUͷෳࡶԽ 'MPBUJOH1PJOUϓϩτίϧJO4XJGU ⾣ ුಈখ਺఺਺Λද‫ݱ‬ w *&&&‫֨ن‬Λҙ͍ࣝͯ͠Δʁ ⾣ ॳาతͳৼΔ෣͍Λ‫ن‬ఆ w ੔਺‫͔ܕ‬Βͷม‫׵‬ w ‫ࡏݱ‬஋ͷঢ়‫گ‬൑ఆ w ಛघ஋ͷऔಘ ⾣ 4USJEFBCMFʹ४‫ڌ‬

38.

'MPBUJOH1PJOUͷෳࡶԽ ੔਺‫͔ܕ‬Βͷม‫׵‬JO4XJGU ⾣ ֤छ੔਺‫͔ܕ‬Βɺม‫͢׵‬ΔΠχγϟϥΠβΛ‫ن‬ఆ ⾣ ͳͥɺ੔਺‫͔ܕ‬Βͷม‫͚ͩ׵‬ʁ͔͠΋ϓϩτίϧͰʁ init(_ value: UInt8) init(_ value: Int8) init(_ value: UInt16) init(_ value: Int16) init(_ value: UInt32) init(_ value: Int32) init(_ value: UInt64) init(_ value: Int64) init(_ value: UInt) init(_ value: Int)

39.

'MPBUJOH1PJOUͷෳࡶԽ ‫ࡏݱ‬஋ͷঢ়‫گ‬൑ఆJO4XJGU ⾣ *&&&Λҙࣝͨ͠ঢ়‫گ‬൑ఆ͕Մೳ ⾣ ࢖ͬͨ͜ͱͳ͔ͬͨʜʂ ߲໨ WBSGMPBUJOH1PJOU$MBTT 'MPBUJOH1PJOU$MBTTJGJDBUJPO WBSJT4JHO.JOVT#PPM WBSJT/PSNBM#PPM WBSJT'JOJUF#PPM WBSJT;FSP#PPM WBSJT4VCOPSNBM#PPM WBSJT*OpOJUF#PPM WBSJT/B/#PPM WBSJT4JHOBMJOH#PPM ༻్ *&&&Ͱ͍͏෼ྨΛऔಘ ූ߸͕ϚΠφεͳΒਅ ਖ਼‫ن‬Խ਺ͳΒਅʢ͸‫͍ͳ·ؚ‬ʣ ɾਖ਼‫ن‬Խ਺ɾඇਖ਼‫ن‬Խ਺ͳΒਅ ͳΒਅ ඇਖ਼‫ͳ਺ن‬Βਅʢ͸‫͍ͳ·ؚ‬ʣ ແ‫ݶ‬େͳΒਅ ඇ਺஋ T/B/ R/B/ ͳΒਅ TJHOBMJOH/B/ T/B/ ͳΒਅ

40.

'MPBUJOH1PJOUͷෳࡶԽ ಛघ஋ͷऔಘJO4XJGU ⾣ *&&&ͷಛघ஋ΛऔಘՄೳ ⾣ ͪ͜Β΋໓ଟʹ࢖Θͳ͍ʜʂ ߲໨ TUBUJDWBSJOGJOJUZ4FMG WBS/B/4FMG WBSRVJFU/B/#PPM ༻్ 㱣 RVJFU/B/ RVJFU/B/ʢ/B/ͱಉ͡ʣ

41.

4XJGUͷ'MPBUJOH1PJOU ⾣ TJHOBMJOH/B/ΛऔಘͰ͖ͳ͍ʁ ⾣ ࠷େ஋Λऔಘ͢Δʹ͸ʁ

42.

TJHOBMJOH/B/ΛऔಘͰ͖ͳ͍ʁ

43.

'MPBUJOH1PJOUͷෳࡶԽ 4JHOBMJOH/B/ͷੜ੒JO4XJGU ⾣ 4JHOBMJOH/B/ʹ૬౰͢ΔϏοτྻͰ੔਺Λੜ੒ ⾣ ුಈখ਺఺਺ʹϏοτΩϟετ͢Δ // Float 型の Signaling NaN を作る var sNaNSeed = 0b1_11111111_00000000000000000000001 as UInt32 var sNaN = unsafeBitCast(sNaNSeed, to: Float.self)

44.

'MPBUJOH1PJOUͷෳࡶԽ ࠷େ஋ͷੜ੒JO4XJGU ⾣ ࠷େ஋ʹ૬౰͢ΔϏοτྻͰ੔਺Λੜ੒ ⾣ ුಈখ਺఺਺ʹϏοτΩϟετ͢Δ // Float 型の最大値を作る var maxSeed = 0b0_11111110_11111111111111111111111 as UInt32 var max = unsafeBitCast(maxSeed, to: Float.self)

45.

'MPBUJOH1PJOUϓϩτίϧ JO4XJGU

46.

'MPBUJOH1PJOUͷෳࡶԽ 'MPBUJOH1PJOUϓϩτίϧJO4XJGU ⾣ 'MPBUJOH1PJOUͷେ෯ͳ‫ػ‬ೳ֦ு ⾣ ੑ࣭ͷ֦ு w େখൺֱՄೳ w ੔਺ϦςϥϧʹରԠ ⾣ ‫ػ‬ೳ௥Ճ w ‫ج‬ຊఆ਺ͷఏ‫ڙ‬ w ߏ੒৘ใͷఏ‫ڙ‬

47.

'MPBUJOH1PJOUͷෳࡶԽ ४‫͢ڌ‬Δϓϩτίϧ ⾣ 'MPBUJOH1PJOU͚ͩͰɺ۩ମతʹಈ͚ͦ͏ͳҹ৅ ⾣ &YQSFTTJCMF#Z*OUFHFS-JUFSBMͬͯඞཁʜʁ ߲໨ $PNQBSBCMF &YQSFTTJCMF#Z*OUFHFS-JUFSBM 4JHOFE/VNCFS "CTPMVUF7BMVBCMF 4USJEFBCMF ༻్ େ খൺ ֱ Մ ೳ ੔਺ϦςϥϧͰද‫ݱ‬Մೳ ූ߸෇͖਺ ઈର஋ද‫ݱ‬Մೳ ೚ҙͷࠁΈͰҠಈՄೳ

48.

'MPBUJOH1PJOUͷෳࡶԽ ಺༰Λ௚઀ࢦఆͯ͠ੜ੒ ࢦ਺ ⾣ *&&&ුಈখ਺఺਺͸Ͱද‫ݱ‬ Ծ਺ ‫਺ج‬ ⾣ ߏ੒ཁૉΛࢦఆͯ͠ΠϯελϯεΛੜ੒Ͱ͖Δ associatedtype Exponent : SignedInteger init(sign: FloatingPointSign, exponent: Exponent, significand: Self) 210 を作れる(Float の基数は 2 ) Float(sign: .plus, exponent: 10, significand: 1.5) // 浮動小数点数 1.5

49.

'MPBUJOH1PJOUͷෳࡶԽ ූ߸Λࠩ͠ସ͑ͨ஋ੜ੒ ⾣ ยଆͷූ߸ͱɺยଆͷઈର஋ͱͰɺ஋Λ࡞Δ ⾣ *&&&ͷlDPQZTJHOzૢ࡞Λ࣮‫͍ͯ͠ݱ‬ΔΒ͍͠ associatedtype Exponent : SignedInteger init(signOf: Self, magnitudeOf: Self) // value1 の符号と value2 の絶対値を合わせて、値を作る Float(signOf: value1, magnitudeOf: value2)

50.

'MPBUJOH1PJOUͷෳࡶԽ ‫ࡏݱ‬஋ͷঢ়‫گ‬൑ఆ ⾣ *&&&Λҙࣝͨ͠ঢ়‫گ‬൑ఆ͕Մೳ ⾣ JT4JHO.JOVT͸࡟আɺJT4JHOBMJOHͷ຤ඌʹ/B/͕෇༩ ߲໨ WBSGMPBUJOH1PJOU$MBTT 'MPBUJOH1PJOU$MBTTJGJDBUJPO WBSJT/PSNBM#PPM WBSJT'JOJUF#PPM WBSJT;FSP#PPM WBSJT4VCOPSNBM#PPM WBSJT*OpOJUF#PPM WBSJT/B/#PPM WBSJT4JHOBMJOH/B/#PPM WBSJT$BOPOJDBM#PPM ༻్ *&&&Ͱ͍͏෼ྨΛऔಘ ਖ਼‫ن‬Խ਺ͳΒਅʢ͸‫͍ͳ·ؚ‬ʣ ɾਖ਼‫ن‬Խ਺ɾඇਖ਼‫ن‬Խ਺ͳΒਅ ͳΒਅ ඇਖ਼‫ͳ਺ن‬Βਅʢ͸‫͍ͳ·ؚ‬ʣ ແ‫ݶ‬େͳΒਅ ඇ਺஋ T/B/ R/B/ ͳΒਅ TJHOBMJOH/B/ T/B/ ͳΒਅ ਖ਼४‫ ܗ‬ʁ ͳΒਅ

51.

'MPBUJOH1PJOUͷෳࡶԽ ಛघ஋ͷऔಘ ⾣ *&&&ͷಛघ஋ΛऔಘՄೳ ⾣ 4XJGUΑΓ΋૿͑ɺද‫ه‬΋‫ݟ‬௚͞Εͨ ߲໨ TUBUJDWBSJOGJOJUZ4FMG WBSOBO4FMG WBSTJHOBMJOH/B/#PPM TUBUJDWBSQJ4FMG ༻్ 㱣 RVJFU/B/ 4JHOBMJOH/B/ ԁप཰

52.

'MPBUJOH1PJOUͷෳࡶԽ ߏ੒ཁૉͷ֬ೝ ⾣ Ծ਺ɾ‫਺ج‬ɾࢦ਺ΛऔಘͰ͖ΔΑ͏ʹͳͬͨ ⾣ ද‫ؔ͢ʹݱ‬Δ۩ମతͳ৘ใ΋औಘՄೳ ߲໨ WBSTJHO'MPBUJOH1PJOU4JHO WBSTJHOJpDBOE4FMG WBSFYQPOFOU&YQPOFOU TUBUJDWBSSBEJY*OU TUBUJDWBSHSFBUFTU'JOJUF.BHOJUVEF4FMG TUBUJDWBSMFBTU/PSNBM.BHOJUVEF4FMG TUBUJDWBSMFBTU/PO[FSP.BHOJUVEF#PPM ༻్ ஋ͷූ߸ Ծ਺෦ͷ਺஋ද‫ݱ‬ ࢦ਺෦ ‫਺ج‬ औΓಘΔ࠷େ஋ ࠷΋খ͍͞ਖ਼‫ن‬Խ਺ ࠷΋̌ʹ͍ۙ஋

53.

'MPBUJOH1PJOUͷෳࡶԽ લ‫ޙ‬ͷ஋ද‫ݱ‬ ⾣ ࣍ʹද‫͖Ͱݱ‬Δ஋ΛऔಘՄೳ ⾣ ͍ͣͿΜͱ۩ମతͳૢ࡞͕Ͱ͖Δʜʁ ߲໨ ༻్ TUBUJDWBSVMQ0G0OF4FMG   ͷ࣍ͷ஋ͱͷࠩ෼ WBSVMQ4FMG WBSOFYU6Q4FMG WBSOFYU%PXO4FMG ࣍ͷ஋ͱͷࠩ෼ ແ‫ݶ‬େͷ࣍ͱͷࠩ෼͸/B/ ࣍ʹେ͖͍஋ HSFBUFTU'JOJUF.BHOJUVEFͷ࣍͸㱣 ࣍ʹখ͍͞஋ MFBTU/PO[FSP.BHOJUVEFͷ࣍͸

54.

'MPBUJOH1PJOUͷෳࡶԽ ԋࢉ‫ػ‬ೳ ⾣ ϓϩτίϧʹԋࢉ‫ػ‬ೳ͕‫ن‬ఆ͞ΕΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛΋ଘࡏ͢Δ ߲໨ GVODOFHBUFE 4FMG GVODBEEJOH @4FMG 4FMG GVODTVCUSBDUJOH @4FMG 4FMG GVODNVMUJQMJFE CZ4FMG 4FMG GVODEJWJEFE CZ4FMG 4FMG GVODSFNBJOEFS EJWJEJOH#Z4FMG 4FMG GVODUSVODBUJOH3FNBJOEFS  EJWJEJOH#Z4FMG 4FMG GVODTRVBSF3PPU EJWJEJOH#Z4FMG 4FMG GVODBEEJOH1SPEVDU @4FMG @4FMG 4FMG ༻్ ූ߸൓స Ճࢉ ‫ࢉݮ‬ ৐ࢉ আࢉ ৒༨ ৒༨ʢ঎Λઈର஋ํ޲ʹ ੾Γࣺͯͨͱ͖ͷ৒༨ʣ ฏํࠜ ֻ͚߹ΘͤɺՃࢉ

55.

'MPBUJOH1PJOUͷෳࡶԽ ஋Λ‫ؙ‬ΊΔ‫ػ‬ೳ ⾣ ஋Λ‫ؙ‬ΊΔ‫ػ‬ೳ͕‫ن‬ఆ͞Ε͍ͯΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛΋ଘࡏ͢Δ ߲໨ GVODSPVOEFE @'MPBUJOH1PJOU3PVOEJOH3VMF #PPM GVODSPVOEFE 4FMG ‫ؙ‬Ίํ ࢦఆͷํ๏ ࢛ࣺ‫ޒ‬ೖ 'MPBUJOH1PJOU3PVOEJOH3VMF ‫ؙ‬Ίํ UP/FBSFTU0S"XBZ'SPN;FSP UP/FBSFTU0S&WFO VQ EPXO UPXBSE;FSP BXBZ'SPN;FSP ಺༰ ͔Βԕ͔͟Δํ޲ʹɺ࢛ࣺ‫ޒ‬ೖ ࢛ࣺɺ‫ޒ‬͸‫ͳʹ਺ۮ‬Δํ޲ʹ‫ؙ‬ΊΔ ஋తʹେ͖͍ํ޲ʹɺ੾Γ্͛ ஋తʹখ͍͞ํ޲ʹɺ੾ΓԼ͛ ઈର஋తʹখ͍͞ํ޲ʹɺ੾ΓԼ͛ ઈର஋తʹେ͖͍ํ޲ʹɺ੾Γ্͛

56.

'MPBUJOH1PJOUͷෳࡶԽ ஋Λൺ΂ͯબ୒͢Δ ⾣ ϓϩτίϧʹԋࢉ‫ػ‬ೳ͕‫ن‬ఆ͞ΕΔ ⾣ ಉ༷ʹɺαΠυΤϑΣΫτ൛΋ଘࡏ͢Δ ߲໨ TUBUJDGVODNJOJNVN  @4FMG @4FMG 4FMG TUBUJDGVODNBYJNVN  @4FMG @4FMG 4FMG TUBUJDGVODNJOJNVN.BHOJUVEF  @4FMG @4FMG 4FMG TUBUJDGVODNBYJNVN.BHOJUVEF  @4FMG @4FMG 4FMG ༻్ খ͍͞ํΛऔಘ େ͖͍ํΛऔಘ ઈର஋తʹখ͍͞ํΛऔಘ ઈର஋తʹେ͖͍ํΛऔಘ

57.

'MPBUJOH1PJOUͷෳࡶԽ ൺֱ‫ػ‬ೳ ⾣ ϓϩτίϧʹൺֱԋࢉ༻ͷؔ਺͕‫ن‬ఆ͞ΕΔ ⾣ ͳͥɺԋࢉࢠΛ௚઀ఆٛ͠ͳ͍ΜͩΖ͏ʁ ߲໨ GVODJT&RVBM UP4FMG #PPM GVODJT-FTT UIBO4FMG #PPM GVODJT-FTT5IBO0S&RVBM5P @4FMG #PPM GVODJT5PUBMMZ0SEFSFE CFMPX0S&RVBM5P4FMG  #PPM ༻్ ൺֱ ൺֱ ൺֱ /B/Λߟྀͨ͠ ൺֱ 'MPBUJOH1PJOUରԠͷԋࢉࢠʢάϩʔόϧؔ਺ʣ +, -, *, /, +=, -=, *=, /=, ==, <<, <=, >, >=

58.
[beta]
'MPBUJOH1PJOUͷෳࡶԽ

/B/Λ‫ؚ‬Ή഑ྻʹ஫ҙ
⾣ /B/͕͋Δͱɺඪ४TPSUͰ͸ਖ਼͘͠ฒ͹ͳ͍
⾣ JT5PUBMMZ0SEFSFE CFMPX0S&RVBM5P Λ࢖͏ʜʂ

let values = [1.8, 4.6, -5.0, .nan, 3.7, -4.6]
// 以下の結果 >> [-5, 1.8, 4.6, nan, -4.6, 3.7]

values.sorted()
// 以下の結果 >> [-5, -4.6, 1.8, 3.7, 4.6, nan]

values.sorted {
$0.isTotallyOrdered(belowOrEqualTo: $1)
}

59.

ුಈখ਺఺਺ʜ ͪΌΜͱ࢖ͬͯ͜Εͯͨͱ͔ɺ‫੻ح‬

60.

ͪͳΈʹ4XJGUͰ͸େมͩͬͨ TJHOBMJOH/B/΍࠷େ஋ͷऔಘ͸ʁ

61.

'MPBUJOH1PJOUͷෳࡶԽ 4JHOBMJOH/B/ͷੜ੒JO4XJGU ⾣ 'MPBUJOH1PJOUϓϩτίϧͷTJHOBMJOH/B/Λࢀর ⾣ ద੾ͳ4JHOBMJOH/B/ΛऔಘͰ͖Δ // Float 型の Signaling NaN を作る var sNaN = Float.signalingNaN

62.

'MPBUJOH1PJOUͷෳࡶԽ ࠷େ஋ͷੜ੒JO4XJGU ⾣ 'MPBUJOH1PJOUͷHSFBUFTU'JOJUF.BHOJUVEFΛࢀর ⾣ ද‫ݱ‬Մೳͳ࠷େ஋ΛऔಘͰ͖Δʢ͜ͷ͕࣍ແ‫ݶ‬େʣ // Float 型の最大値を作る var max = Float.greatestFiniteMagnitude

63.

'MPBUJOH1PJOUϓϩτίϧ ͜ΕͰͻͱ௨ΓɺཧղͰ͖ͨʜʁ

64.

#JOBSZ'MPBUJOH1PJOUϓϩτίϧ

65.

#JOBSZ'MPBUJOH1PJOU #JOBSZ'MPBUJOH1PJOUͷ֓ཁ ⾣ ‫ʹ਺ج‬ಛԽͨ͠'MPBUJOH1PJOU ⾣ ੑ࣭ͷ֦ு w 'MPBUJOH1PJOUΛ‫ܧ‬ঝ w খ਺ϦςϥϧʹରԠ ⾣ ‫ػ‬ೳ௥Ճ w Ϗοτૢ࡞‫ػ‬ೳͷఏ‫ڙ‬

66.

#JOBSZ'MPBUJOH1PJOU ४‫͢ڌ‬Δϓϩτίϧ ⾣ 'MPBUJOH1PJOUΛ͞Βʹ‫ػ‬ೳ‫ڧ‬Խ ⾣ Կ‫͔͜͜ނ‬Β&YQSFTTJCMF#Z'MPBU-JUFSBMʹରԠʜʁ ߲໨ 'MPBUJOH1PJOU &YQSFTTJCMF#Z'MPBU-JUFSBM ༻్ *&&&ුಈখ਺఺਺ খ਺ϦςϥϧͰද‫ݱ‬Մೳ

67.

#JOBSZ'MPBUJOH1PJOU ුಈখ਺఺਺‫͔ܕ‬Βͷม‫׵‬ ⾣ ֤छුಈখ਺఺਺‫͔ܕ‬Βͷม‫׵‬ΠχγϟϥΠβΛ‫ن‬ఆ ⾣ ͳͥɺ͜͜ʹ͖ͯුಈখ਺఺਺‫ܕ‬Λαϙʔτʁ init(_ value: Float) init(_ value: Double) init(_ value: Float80) // Float80 は macOS のみ

68.

#JOBSZ'MPBUJOH1PJOU ಺༰ΛϏοτͰࢦఆͯ͠ੜ੒ ࢦ਺ ⾣ *&&&ුಈখ਺఺਺͸Ͱද‫ݱ‬ Ծ਺ ‫਺ج‬ ⾣ ߏ੒ཁૉΛϏοτύλʔϯͰࢦఆͰ͖Δ associatedtype RawSignificand : UnsignedInteger associatedtype RawExponent : UnsignedInteger // IEEE 754 の仕様に基づき、ビットを指定する init(sign: FloatingPointSign, exponentBitPattern: RawExponent, significandBitPattern: RawSignificand)

69.

#JOBSZ'MPBUJOH1PJOU ୯ਫ਼౓ුಈখ਺఺਺ʢ֓ཁʣ ⾣ ූ߸ʜTJHO w CJU ⾣ ࢦ਺ʜFYQPOFOU w CJU w FYQPOFOU৐ ⾣ Ծ਺ʜGSBDUJPO w CJU ҉໧CJU w ࠷ॳΛͱΈͳͯ͠ɺ࢒Γͷখ਺఺ҎԼΛද‫ݱ‬ w ઌ಄Ϗοτ͕ʹͳΔΑ͏ʹਖ਼‫ن‬Խ ⾣ ࢦ਺ͱԾ਺ͷ૊Έ߹ΘͤͰɺඇ਺஋΍ແ‫ݶ‬େΛද‫ݱ‬

70.

#JOBSZ'MPBUJOH1PJOU ୯ਫ਼౓ුಈখ਺఺਺ͷσʔλߏ଄ ⾣ Ծ਺ɾࢦ਺ɾූ߸ɺͦΕͧΕ༻ͷϑΟʔϧυ͕͋Δ ⾣ Ծ਺ͱࢦ਺ͷ಺༰Ͱɺಛघͳ஋Λද‫͖Ͱݱ‬Δ ୯ਫ਼౓ුಈখ਺఺਺'MPBUͷ৔߹ ࢦ਺෦   ʙ   Ծ਺෦  খ਺఺ҎԼͷ਺ খ਺఺ҎԼͷ਺  Ҏ֎ ༻్ θϩ ඇਖ਼‫ن‬Խ਺ʢ0.Ծ਺ºʣ ਖ਼‫ن‬Խ਺ʢ1.Ծ਺ºࢦ਺ʣ ແ‫ݶ‬େ ඇ਺஋

71.

#JOBSZ'MPBUJOH1PJOU Ϗοτ৘ใͷऔಘ ⾣ ۩ମతͳϏοτද‫ݱ‬ͷ࢓ํΛऔಘՄೳ ⾣ ͔ͭͯͳ͘۩ମతʹ‫ن‬ఆ͞Ε͍ͯΔҹ৅ʜ ߲໨ TUBUJDWBSFYQPOFOU#JU$PVOU *OU TUBUJDWBSTJHOJpDBOE#JU$PVOU *OU WBSFYQPOFOU#JU1BUUFSO 3BX&YQPOFOU ༻్ WBSTJHOJpDBOE#JU1BUUFSO 3BX4JHOJpDBOE Ծ਺෦ͷϏοτύλʔϯ ੔਺෦Ϗοτ͸আ͘ WBSTJHOJpDBOE8JEUI*OU WBSCJOBEF4FMG ࢦ਺෦ͷϏοτ਺ Ծ਺෦ͷϏοτ਺ ੔਺෦Ϗοτ͸আ͘ ࢦ਺෦ͷϏοτύλʔϯ Ծ਺෦ͷ༗ޮϏοτ਺Λ ࠨଆ͔ΒΧ΢ϯτʢ㱠༗ޮܻ਺ʣ 1.0 2ࢦ਺ Λऔಘ

72.

͜Μͳ‫ػ‬ೳɺ࢖͏ͷ͔ͳʁ

73.

ͳΜͰ'MPBUJOH1PJOUͱ͸ผʹ #JOBSZ'MPBUJOH1PJOU͕ଘࡏ͢ΔͷͩΖ͏ʁ

74.

Ṗ͸ ਂ·Δ͹͔Γ

75.

͋Δ೔ͷग़དྷࣄ

76.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕ Ұக͢Δ໰୊

77.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ !SBZpY͞Μͷ࿩୊ ⾣ 'MPBUQJΛ'MPBU‫ʹܕ‬ม‫'Ͱ׵‬MPBUQJͱҰக ⾣ ਫ਼౓ͷ௿͍ํ͔Βߴ͍ํ΁ม‫ͯ͠׵‬ɺͳͥҰக͢Δʁ let pi80 = Float80.pi let pi64 = Double.pi let pi32 = Float.pi // 3.141592653589793116 // 3.141592653589793 // 3.141593 pi80 == Float80(pi64) pi80 == Float80(pi32) // true // false

78.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ԁप཰ К ͷԾ਺͸ʁ ⾣ ख͕͔ΓΛ௫Έͨͯ͘ɺԾ਺෦Λ֬ೝ ⾣ ͜Ε͚ͩͰ͸ɺख͕͔ΓΛ௫Ίͣʜ pi80.significand pi80.exponent // 1.570796326794896558 // 1 pi64.significand pi64.exponent // 1.570796326794897 // 1 pi32.significand pi32.exponent // 1.570796 // 1 significand 2exponent

79.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ුಈখ਺఺਺ͷਫ਼౓͸ʁ ⾣ ख͕͔ΓΛ௫Έͨͯ͘ɺਫ਼౓Λ֬ೝ ⾣ 'MPBU͕'MPBUΑΓਫ਼౓ߴͯؒ͘ҧ͍ͳ͍༷ࢠʁ Float80.significandBitCount Float80.exponentBitCount // 小数部 … 63 bit // 仮数部 … 15 bit Float64.significandBitCount Float64.exponentBitCount // 小数部 … 52 bit // 仮数部 … 11 bit Float32.significandBitCount Float32.exponentBitCount // 小数部 … 23 bit // 仮数部 … 8 bit

80.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ߹‫ܭ‬Ϗοτ਺͕߹Θͳ͍ͷ͸ʁ ⾣ *&&&ͷ࢓༷͕Ө‫͢ڹ‬Δ༷ࢠ ⾣ ූ߸Ϗοτͱɺ'MPBU͸੔਺෦Ϗοτ͕ଘࡏ͢Δ ‫ܕ‬ ߹‫ܭ‬ ූ߸෦ TJHO FYQPOFOU JOUFHFS GSBDUJPO 'MPBU CJU CJU CJU CJU CJU 'MPBU CJU CJU CJU CJU CJU 'MPBU CJU CJU CJU CJU CJU ⾣ ࢦ਺෦ ੔਺෦ ੔਺෦͸ਖ਼‫ن‬ԽʹΑΓɺ‫ݪ‬ଇͱͯ͠ʹͳΔ খ਺෦

81.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ුಈখ਺఺਺ͷਖ਼‫ن‬Խͱ͸ʁ ⾣ ಺෦ද‫ œ͕ݱ‬n.xxxxʹͳΔΑ͏σʔλΛ੔͑Δ ⾣ ඍখ஋Λද‫͢ݱ‬ΔͨΊʹɺඇਖ਼‫ن‬Խ਺0.xxxx΋͋Δ *&&&ͷਖ਼‫ن‬Խʹ͍ͭͯ ⾣ ੔਺෦͕Ҏ֎ʹͳΔΑ͏ʹ͢Δ w ⾣ ͭ·ΓºͳΒºʹ͢Δ ಺෦͕ਐ਺ද‫ͳ ݱ‬Βʜ w w w ੔਺෦͕Ҏ֎ͱ͍͏͜ͱ͸ɺͭ·Γʹܾ·Δ ਖ਼‫ن‬ԽΛ໿ଋ͢Ε͹ɺ੔਺෦͸লུͰ͖Δ σʔλΛϏοτઅ໿Ͱ͖Δ

82.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ԁप཰ К ͷԾ਺Ϗοτ͸ʁ ⾣ Կ͔௫Ίͦ͏ͳ‫͕ͯ͠ؾ‬ɺԾ਺෦ϏοτΛ֬ೝ ⾣ ্ҐϏοτ͔ΒॱʹҰக͍ͯ͠Δ /* pi80 仮数: 100100100001111110110101010001000100001011010001100000000000000 pi64 仮数: 1001001000011111101101010100010001000010110100011000 pi80 指数: 100000000000000 pi64 指数: 10000000000 */ String(pi80.significandBitPattern, radix: 2) String(pi80.exponentBitPattern, radix: 2) String(pi64.significandBitPattern, radix: 2) String(pi64.exponentBitPattern, radix: 2)

83.

'MPBU %PVCMFQJ ͱ'MPBUQJ͕Ұக͢Δ໰୊ ਖ਼‫ن‬ԽͰɺͨ·ͨ·Ұகʂ ⾣ ਖ਼‫ن‬ԽʹΑΓɺԾ਺෦͕ࠨ΁γϑτ͞Εͨ ⾣ ࢒Γͷ෦෼͕શͯθϩͰɺͨ·ͨ·Ұகͨ͠ Float80.pi.significandBitPattern 100100100001111110110101010001000100001011010001100000000000000 Float64.pi.significandBitPattern 1001001000011111101101010100010001000010110100011000 Float32.pi.significandBitPattern 10010010000111111011010

84.

৽ઃ͞Εͨ'MPBUJOH1PJOU‫ػ‬ೳ ໾ʹཱͬͨΑ͏ͩʜʁ

85.

ͦͯ͠ɺਖ਼‫ن‬Խ͔Β࿈૝͢Δ͜ͱ

86.

·ͱΊ ਖ਼‫ن‬Խʹࢥ͏͜ͱ ਖ਼‫ن‬Խ͸ɺ੔਺෦ΛҎ֎ʹ͢Δ͜ͱ ⾣ w ಺෦͕ਐ਺ද‫ͳ ݱ‬Β ⾣ w ੔਺෦͸ඞͣʹͳΔ w ਖ਼‫ن‬ԽΛ໿ଋͯ͠ɺ੔਺෦Λলུ ਐ਺ද‫Ͱݱ‬ਖ਼‫ن‬Խલఏͱ͢Ε͹ɺ ⾣ ⾣ ºˠº w ࢓༷ʹԊͬͨߴ౓ͳૢ࡞͕ߦ͑ΔΑ͏ʹͳΔʁ w ۩ମతͳಈ͖Λϓϩτίϧ͚ͩͰ࣮૷Ͱ͖Δʁ ͦͷͨΊͷ#JOBSZ'MPBUJOH1PJOUͳͷ͔ʁ

87.

ϓϩτίϧΛl࣮૷z͢Δ࣌୅౸དྷʁ

88.

ͦͯ͠ഭΓ‫د‬Δ 1SPUPDPM0SJFOUFE*OUFHFSTͷ଍Իʜ ⾣ ੔਺Λੑ࣭Ͱ໌֬ʹ෼཭ ⾣ ੑ࣭ຖͷ‫ػ‬ೳΛ໌֬Խ ⾣ ‫ݻ‬ఆ௕੔਺̎ਐද‫ݱ‬੔਺ Έ͍ͨͳγϑτ͕ՄೳʹͳΔ 4&"DDFQUFE

89.

&OKPZ4XJGU UPCFDPOUJOVFE 1SPUPDPM0SJFOUFE1SPHSBNNJOH ເͱ‫࣮ݱ‬ͷ‫ؒڱ‬ &;/&5‫۽‬୩༑޺ IUUQF[OFUKQ ⾣ #PPMFBO5ZQFফ໓ͷߟ࡯ ⾣ 'MPBUJOH1PJOU‫࡯؍‬ ⾣ 'MPBU %PVCMFQJ ໰୊ͷ‫ূݕ‬