Objective-C のキャストと Swift の型変換を比べてみる #akibaswift

135 Views

May 30, 16

スライド概要

AKIBA.swift 第2回 の発表資料です!

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

profile-image

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

シェア

またはPlayer版

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

関連スライド

各ページのテキスト
1.

0CKFDUJWF$ ͷΩϟετͱ 4XJGU ͷ‫ܕ‬ม‫׵‬Λൺ΂ͯΈΔ Š",*#"TXJGUୈ̎ճ &;/&5‫۽‬୩༑޺ 4XJGU IUUQF[OFUKQ

2.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ษ‫ڧ‬ձ ԣ඿J1IPOF։ൃऀษ‫ڧ‬ձ ΧδϡΞϧ4XJGUษ‫ڧ‬ձ ZJEFW ˏԣ඿ɾഅंಓ DTXJGU !ԣ඿ɾ੨༿୆ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕໨తͷձ ΏΔ͘ΈΜͳͰ4XJGUʹ͍ͭͯ ‫ޠ‬Β͑Δ৔͕ཉͯ࢝͘͠Ίͨձ ୈ̎̐ճΛʹ։࠵‫ࠐݟ‬Έ ୈ̕ճΛʹ։࠵༧ఆ

3.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ॻ੶ొஃ 9DPEFపఈղઆ .04" 9DPEFͷશ‫ػ‬ೳΛ పఈతʹղઆͨ͠ຊ 049J04‫ܥ‬ͷྺ࢙ਂ͍ ༗ྉձһ੍ͷษ‫ڧ‬ձ 9DPEFͰ΋໾ཱͭ͸ͣ ๏ਓձһ΋ଟ਺ 紙版は絶版、電⼦書籍は販売中

4.

‫۽‬୩༑޺ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ J04 049 "QQMF8BUDIΞϓϦ $PEF1JFDF ͍ͭ΋ͷి୎ ιʔείʔυΛ5XJUUFSͱ (JTUʹಉ࣌౤ߘͰ͖Δɻ ‫ࣜࢉܭ‬΋‫͑ݟ‬Δి୎ΞϓϦɻ XBUDI04ରԠ ԻͰ࠶഑ୡΰου &;/&5*11IPOF ؆୯ૢ࡞Ͱ ࠶഑ୡͷਃ͠ࠐΈɻ J1IPOFͰͻ͔Γి࿩Λ࢖͏ɻ ࣗ୐-"/͔Βͷར༻ઐ༻

5.

$PEF1JFDFGPS04 9 ษ‫ڧ‬ձΛָ͠ΉΞϓϦ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌౤ߘͰ͖Δ ษ‫ڧ‬ձͰ஌‫ݟ‬ΛΈΜͳͱ‫ڞ‬༗͍ͨ࣌͠ͱ͔ʹศརʂ Ͱ͖Δ͜ͱ BLJCBTXJGU

6.

Ωϟετͱ‫ܕ‬ม‫׵‬ 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ

7.

Ωϟετͱ‫ܕ‬ม‫׵‬ ໨ඪ  0CKFDUJWF$ͱ4XJGUͷ ‫ܕ‬ͷม‫ํ׵‬๏Λͬ͘͟Γൺ΂Δ  0CKFDUJWF$ͱ4XJGUͰͷ ‫ܕ‬ม‫׵‬ͷงғ‫ؾ‬ΛோΊͯΈΔ  4XJGUʹ͓͚Δ Ωϟετͷ‫ج‬ຊΛ೺Ѳ͢Δ

8.

0CKFDUJWF$ Ωϟετͱ‫ܕ‬ม‫׵‬

9.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ֓ཁ ⾣ ͋Δ‫ܕ‬ͷ஋Λผͷ‫Ͱܕ‬ද‫͠ݱ‬௚͢ ⾣ $4UZMF ͷ ΩϟετԋࢉࢠΛ࢖͏ ⾣ ‫͕ ޠݴ‬ม‫ػ׵‬ೳΛఏ‫ڙ‬ w ϓϦϛςΟϒͳ஋ͷม‫׵‬ w σʔλͷ࠶ղऍ w ΫϥεͷΩϟετ  TUBUJDDBTU   SFJOUFSQSFUFEDBTU   VQEPXODBTU

10.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ϓϦϛςΟϒͳ஋Λม‫׵‬ʢ໌ࣔΩϟετʣ ⾣ ΩϟετԋࢉࢠΛ࢖ͬͯม‫͢׵‬Δ ⾣ Մೳͳ‫ݶ‬ΓͰɺಉ͡஋ʹม‫͞׵‬ΕΔ NSInteger integerValue = 10; double doubleValue = 128.9; // 明示キャスト NSUInteger value1 = (NSUInteger)integerValue; NSInteger value2 = (NSInteger)doubleValue; char value3 = (char)integerValue; double value4 = (double)integerValue;

11.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ϓϦϛςΟϒͳ஋Λม‫׵‬ʢ҉໧Ωϟετʣ ⾣ Ωϟετԋࢉࢠ͸লུͰ͖Δ ⾣ ࠷ऴతͳ‫ʹܕ‬Ԡͯࣗ͡ಈతʹม‫׵‬ NSInteger integerValue = 10; double doubleValue = 128.9; // 暗黙キャスト NSUInteger value1 = integerValue; NSInteger value2 = doubleValue; char value3 = integerValue; double value4 = integerValue;

12.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ஋ͷม‫͕ࠩޡʹ࣌׵‬ੜ͡Δ৔߹ʹ஫ҙ ⾣ ม‫࣌׵‬ɺ஋͸దٓௐ੔͞ΕΔʢ‫ൃࠩޡ‬ੜʣ ⾣ ม‫׵‬ઌͰ஋Λද‫͕͋ͱ͍͜ͳ͖Ͱݱ‬Δ NSInteger integerValue = -8000000000000002345; double doubleValue = 123456789.935; // 誤差が出るキャスト NSInteger value1 = doubleValue; double value2 = integerValue; NSUInteger value3 = integerValue; short value4 = doubleValue; // 123456789 // -8000000000000002048 // 10446744073709549271u // -13035

13.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ‫͢ࡏ͕ࠞܕʹ࣌ࢉܭ‬Δͱ҉໧ม‫׵‬ ⾣ ‫͢ࡏ͕ࠞܕ‬Δͱɺͻͱͭͷ‫ʹܕ‬ม‫͞׵‬ΕΔ ⾣ ਫ਼౓ͷߴ͍‫ʹ ܕ‬ἧ͑ΒΕΔ doubleValue + floatValue floatValue + doubleValue doubleValue + longDoubleValue intValue + floatValue intValue + charValue intValue + longValue charValue + shortValue // double // double // long double // float // int // long // int

14.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ‫࣌ࢉܭ‬ͷ҉໧ม‫ʹ׵‬ΑΔ‫ʹࠩޡ‬஫ҙ ⾣ ಉ͡‫ࢉܭ‬΋ɺਫ਼౓ʹΑͬͯ݁Ռ͕ҟͳΔ ⾣ ൺֱ࣌ʹਫ਼౓͕֦ு͞ΕɺҰக͠ͳ͍ 1 / 3.0 1 / 3.0f 1 / 3 // 0.3333333333333333 // 0.33333333f // 0 1 / 3.0 == 1 / 3 1 / 3.0 == 1 / 3.0f // false // false

15.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ҉໧ม‫ʹ׵‬ΑΔ‫ࠩޡࢉܭ‬Λ੍‫ޚ‬ ⾣ ద੾ʹͳΔΑ͏ʹ໌ࣔΩϟετͰ੍‫͢ޚ‬Δ ⾣ Ͳ͏͢Δͱద੾͔͸ɺͦͷ৔ʹΑΔ int a = 1, b = 3, c = 5, d = 4; // 明示キャストによる制御 c * (a / b * d) c * (a / (double)b * d) c * (int)(a / (double)b * d) (int)(c * ((double)a / b * d)) c * (double)(a / b) * d // 0 // 6.666666666666666 // 5 // 6 // 0

16.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ σʔλΛͦͷ··࠶ղऍʢϏοτΩϟετʣ ⾣ ϙΠϯλΛհͯ͠ɺσʔλͷղऍΛมߋ ⾣ σʔλΛͦͷ··೚ҙͷ‫ܕ‬ͷද‫ͱݱ‬Έͳ͢ short shortValue = 0x7FFF; long longValue = 0x12345678; // 再解釈キャスト short value1 = *(short*)&longValue; // 0x5678 long value2 = *(long*)&shortValue; // 0x6080000000207FFF double value3 = *(double*)&longValue; // 1.508974781700064e-315

17.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ Ϋϥεͷ໌ࣔΩϟετ ⾣ ͋ΔΫϥε‫ܕ‬ΛผͷΫϥε‫ͱܕ‬Έͳ͢ ⾣ Πϯελϯεࣗମ͸Կ΋มΘΒͳ͍ NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = (NSObject*)data; // ダウンキャスト NSMutableData *obj2 = (NSMutableData*)data;

18.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ Ϋϥεͷ҉໧ΞοϓΩϟετ ⾣ ΞοϓΩϟετ͸҉໧తʹΩϟετՄೳ ⾣ ‫ܧ‬ঝؔ܎ͷఆٛʹΑΓ໌Β͔ NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = data; // ダウンキャストは明記が必要 NSMutableData *obj2 = (NSMutableData*)data;

19.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ‫ڥݟ‬ͷͳ͍ΫϥεΩϟετʹ஫ҙ ⾣ ͲΜͳΫϥεʹ΋໌ࣔΩϟετՄೳ ⾣ Πϯελϯεࣗମ͸Կ΋มΘΒͳ͍ʂ NSString *obj = [[NSString alloc] init]; // 無関係な型へのキャスト NSNumber *number = (NSNumber*)obj; // メソッドが存在しなければ実行時エラー NSString *text = [number descriptionWithLocale: nil]; VOSFDPHOJ[FETFMFDUPSTFOUUPJOTUBODF

20.

Ωϟετͱ‫ܕ‬ม‫׵‬JO0CKFDUJWF$ ͋ΔΫϥε΁ͷΩϟετ͕Մೳͳ͜ͱΛอূ ⾣ ΩϟετՄೳͰ͋Δ͔Λ൑ఆ ⾣ /40CKFDU͕൑ఆ‫ػ‬ೳΛఏ‫ڙ‬ id object; // 可能性の判定 if ([object isKindOfClass:[NSNumber class]]) { // 整合性が約束されればキャストを実施 NSNumber *number = (NSNumber*)object; }

21.

Ωϟετͱ‫ܕ‬ม‫׵‬ 0CKFDUJWF$ʹ͓͚Δҹ৅

22.

Ωϟετͱ‫ܕ‬ม‫׵‬ 0CKFDUJWF$ʹ͓͚ΔΩϟετͷҹ৅ ⾣ ‫ۃੵ͕ޠݴ‬తʹࣗಈม‫ͯ͘͠׵‬ΕΔ ⾣ ద੾ͳม‫ޚ੍׵‬͸ϓϩάϥϚʔͷ੹೚ ⾣ ΩϟετԋࢉࢠΛ࢖੍ͬͯ‫͢ޚ‬Δ ⾣ ෳࡶͳҹ৅ w ࣗಈม‫ࣔ໌ͱ׵‬ม‫׵‬ͷ൑அ͕ඞཁ w ม‫ࣦʹ׵‬ഊͨ͠৔߹ʹ‫͍͘ʹ͖ͮؾ‬ w ஋ͱΫϥεͰม‫ॲ׵‬ཧʹ౷Ұ‫͍ͳ͕ײ‬

23.

4XJGU Ωϟετͱ‫ܕ‬ม‫׵‬

24.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU ֓ཁ ⾣ ผͷ‫ܕ‬ද‫ʹݱ‬ม‫͢׵‬Δ w 'VMM8JEUIม‫׵‬ w /BSSPXม‫׵‬ w ࠶ղऍʹΑΔม‫׵‬ ⾣ ผͷ‫ʹܕ‬Ωϟετ͢Δ w Ϋϥε‫΁ܕ‬ͷΩϟετ w ϓϩτίϧ‫΁ܕ‬ͷΩϟετ w ϒϦοδ  VQEPXODBTU 

25.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU 'VMM8JEUIม‫׵‬ʢී௨ͷ‫ܕ‬ม‫׵‬ʣ ⾣ ͋Δ‫ܕ‬ͷ஋Λผͷ‫΁ܕ‬ม‫͢׵‬Δ ⾣ ม‫׵‬ΠχγϟϥΠβΛ࢖࣮ͬͯࢪ let integerValue: Int = 65 let doubleValue: Double = 128.9 // 型を変換 let value1 = UInt(integerValue) let value2 = Int(doubleValue) let value3 = UnicodeScalar(integerValue) let value4 = Double(integerValue)

26.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU 'VMM8JEUIม‫͖ͱ͍ͳ͖Ͱ͕׵‬ ⾣ ద੾ͳ‫ܕ‬ม‫͖ͱ͍ͳ͖Ͱ͕׵‬͸தஅ ⾣ ྫ֎΍OJM΍ΤϥʔͰ௨஌͢Δ let sourceValue: UInt = 18446744073709551615 // 変換できないとき let value1 = Int(sourceValue) *OUFHFSPWFSqPXTXIFODPOWFSUFEGSPNb6*OU`UPb*OU` let value2 = Int("120x") let value3 = try MyValue(sourceValue) // nil // Error

27.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU /BSSPXม‫׵‬ʢഁյΛ൐͏ม‫׵‬ʣ ⾣ ҙຯ͕มΘΔՄೳੑͷ͋Δ‫ܕ‬ม‫׵‬ ⾣ Ҿ਺ϥϕϧ෇͖ΠχγϟϥΠβͰ࣮ࢪ let source: UInt = 18446744073709551000 // 型を変換 let value1 = Int(bitPattern: source) // -616 let value2 = Int8(truncatingBitPattern: source) // -104

28.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU σʔλΛͦͷ··࠶ղऍʢϏοτΩϟετʣ ⾣ ಺෦σʔλΛͦͷ··ผͷ‫ʹܕ‬ม‫׵‬ ⾣ ม‫׵‬લ‫Ͱޙ‬σʔλαΠζ͕ҟͳΔͱΤϥʔ let source: Int64 = 0x12345678 // 再解釈 var value1 = unsafeBitCast(source, Double.self) // 1.508974781700064e-315 var value2 = unsafeBitCast(source, Int32.self) DBOUVOTBGF#JU$BTUCFUXFFOUZQFTPGEJ⒎FSFOUTJ[FT

29.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU ΫϥεͷΩϟετ ⾣ ͋ΔΫϥε‫ܕ‬ΛผͷΫϥε‫ͯ͠ͱܕ‬ѻ͏ ⾣ as as? as!ԋࢉࢠΛ࢖ͬͯΩϟετ͢Δ let instance: NSData = NSMutableData() // アップキャスト let object1 = instance as NSObject // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData

30.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU Ϋϥεͷ҉໧ΞοϓΩϟετ ⾣ ΞοϓΩϟετ͸҉໧తʹΩϟετՄೳ ⾣ ‫ܧ‬ঝؔ܎ͷఆٛʹΑΓ໌Β͔ let instance: NSData = NSMutableData() // アップキャスト let object1: NSObject = instance // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData

31.

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU ؔ܎ͳ͍Ϋϥε΁ͷΩϟετ ⾣ ෆద੾ͳΫϥεʹ໌ࣔΩϟετ͢ΔͱOJM ⾣ Ωϟετʹࣦഊͨ͜͠ͱ͕໌ྎ let object = NSString() // 無関係な型へのキャスト let number1 = object as? NSData // nil let number2 = object as! NSData // ERROR &9$@#"%@*/4536$5*0/

32.

Ωϟετͱ‫ܕ‬ม‫׵‬ 4XJGUʹ͓͚Δҹ৅

33.

Ωϟετͱ‫ܕ‬ม‫׵‬ 4XJGUʹ͓͚Δ‫ܕ‬ม‫׵‬ͷҹ৅ ⾣ ‫ʹޠݴ‬ΑΓม‫ޚ੍׵‬Λ‫ڧ‬ཁ͞ΕΔ ⾣ ద੾ͳม‫ޚ੍׵‬͸ϓϩάϥϚʔͷ੹೚ ⾣ ม‫׵‬ΠχγϟϥΠβ΍ΩϟετԋࢉࢠͰ੍‫ޚ‬ ⾣ γϯϓϧͰ໌ྎͳҹ৅ w ‫ݪ‬ଇɺ໌ࣔม‫׵‬ͷ൑அ͕ඞཁ w ม‫ࣦʹ׵‬ഊͨ͜͠ͱ͕ଈ࠲ʹ෼͔Δ w શମతʹ౷Ұ‫ײ‬ͷ͋Δ‫ࡌه‬

34.

͜͜·Ͱͷ·ͱΊ Ωϟετͱ‫ܕ‬ม‫׵‬

35.

Ωϟετͱ‫ܕ‬ม‫׵‬ ҹ৅ͷ·ͱΊ 0CKFDUJWF$ ҹ৅ 4XJGU ෳࡶ γϯϓϧ ஋ͱ‫Ͱܕ‬ҹ৅͕ҟͳΔ ౷Ұ‫͕͋ײ‬Δ ద੾ͳม‫׵‬Λ ϓϩάϥϚʔ͕ෛ͏ ࣮ࢪ͢Δ੹೚ ϓϩάϥϚʔ͕ෛ͏ ม‫ํ׵‬๏ͷ ఆٛͱద༻ ‫نͰ༷࢓ޠݴ‬ఆ ੵ‫ۃ‬తʹࣗಈม‫׵‬ ‫نͯ͠ͱ૷࣮͕ܕ‬ఆ ϓϩάϥϚʔ͕໌ࣔม‫׵‬ ม‫׵‬खஈ Ωϟετԋࢉࢠ ‫֤͕ͭ࣋ܕ‬छ‫ػ‬ೳ Ωϟετԋࢉࢠ ม‫׵‬ΠχγϟϥΠβ ద੾ͳม‫͕׵‬ ‫ߦڧ‬ಥഁ Ͱ͖ͳ͍ͱ͖ ม‫ͱ͍͜ͳ͖Ͱ׵‬Λ௨஌ ྫ֎ΤϥʔOJM

36.

Ωϟετͱ‫ܕ‬ม‫׵‬ ߏจͷ·ͱΊ 0CKFDUJWF$ 4XJGU ஋ͷม‫׵‬ ʢࣗ෼΁ʣ (int)value Int(value) ஋ͷม‫׵‬ ʢࣗ෼͔Βʣ [instance toDouble] Double(instance) Ωϟετ (SubClass*)object (BaseClass*)object object as? SubClass object as BaseClass Ωϟετͷ Մೳੑ൑ఆ [object isKindOfClass: if let obj = object [SomeClass class]] as? SomeClass { ஋ʹର͢Δ *(double*)&value ϏοτΩϟετ unsafeBitCast( value, Double.self)

37.

‫ܕ‬ม‫׵‬ͷ࣮૷ 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ

38.

0CKFDUJWF$ ‫ܕ‬ม‫׵‬ͷ࣮૷

39.

‫ܕ‬ม‫׵‬ͷ࣮૷JO0CKFDUJWF$ ֓ཁ ⾣ ࣗ࡞Ϋϥεʹ 'VMM8JEUIม‫ػ׵‬ೳΛ࣋ͨͤΔ ⾣ ࣗ࡞ΫϥεΛத৺ʹ૬‫ޓ‬ม‫͢׵‬Δ w ඞཁͳ͚Ε͹ยଆม‫׵‬ ҙࣝ ⾣ ࣗ࡞Ϋϥε͕੹೚Λ࣋ͬͯఏ‫͢ڙ‬Δ

40.

‫ܕ‬ม‫׵‬ͷ࣮૷JO0CKFDUJWF$ ࣗ਎ͷ‫΁ܕ‬ͷม‫ػ׵‬ೳΛఆٛ ⾣ ΠχγϟϥΠβΛ࢖ͬͯఆٛ͢Δ ⾣ ໊લ͸Ұൠʹl8JUI ‫໊ܕ‬zΛ͚ͭΔ༷ࢠ @interface ESMyObject : NSObject // NSInteger 型から自分の型に変換する - (instancetype)initWithInteger:(NSInteger)value; @end

41.

‫ܕ‬ม‫׵‬ͷ࣮૷JO0CKFDUJWF$ ࣗ਎ͷ‫͔ܕ‬Βͷม‫ػ׵‬ೳΛఆٛ ⾣ ࣗ࡞ͷ‫͢૷࣮ʹܕ‬Δͷ͕Ұൠత ⾣ ໊લ͸lUP ‫໊ܕ‬z͕෼͔Γ΍ͦ͢͏ @interface ESMyObject : NSObject // 自分自身から NSInteger に変換 - (NSInteger)toInteger; @end

42.

੹೚ͷ‫఺؍‬JO0CKFDUJWF$ ಠࣗͷม‫ߏػ׵‬Λ࢖͏ ⾣ ࣗ෼ࣗ਎Ͱ࣮૷ͨ͠‫ػ‬ೳΛ࢖͏ ⾣ ϓϦϛςΟϒ‫ܕ‬ͷΩϟετͱ͸ҹ৅͕ҟͳΔ // NSInteger から自分自身に変換 ESMyObject *object = [[ESMyObject alloc] initWithInteger: 10]; // 自分自身を NSInteger に変換 NSInteger value = [object toInteger];

43.

੹೚ͷ‫఺؍‬JO0CKFDUJWF$ ม‫ػ׵‬ೳͱී௨ͷ‫ػ‬ೳͷ۠ผ͸͠ʹ͍͘ ⾣ 'VMM8JEUIม‫ػ׵‬ೳ͕ଞͷ‫ػ‬ೳͱࠞࡏ ⾣ ໊લ͔Β͸۠ผ͠ʹ͍͘ @interface ESMyObject : NSObject // NSLocale からの変換? - (instancetype)initWithLocale:(NSLocale)locale; // 自分自身から NSPoint への変換? - (NSPoint)toPoint; @end

44.

4XJGU ‫ܕ‬ม‫׵‬ͷ࣮૷

45.

‫ܕ‬ม‫׵‬ͷ࣮૷JO4XJGU ֓ཁ ⾣ ࣗ࡞‫'ʹܕ‬VMM8JEUIม‫׵‬Λ࣋ͨͤΔ ⾣ ࣗ࡞‫Ͳʹܕ‬ͷ‫͔ܕ‬Βม‫͖Ͱ׵‬Δ͔໌‫ه‬ ⾣ ૬‫ޓ‬ม‫͕׵‬ඞཁͳ৔߹͸ม‫׵‬ઌʹɺ ࣗ࡞‫͔ܕ‬Βͷม‫ػ׵‬ೳΛ࣮૷ ҙࣝ ⾣ ม‫׵‬ઌ͕੹೚Λ࣋ͬͯఏ‫͢ڙ‬Δ

46.

‫ܕ‬ม‫׵‬ͷ࣮૷JO4XJGU ࣗ਎ͷ‫΁ܕ‬ͷม‫ػ׵‬ೳΛఆٛ ⾣ ม‫׵‬ΠχγϟϥΠβΛ࢖ͬͯఆٛ͢Δ ⾣ ࠷ॳͷҾ਺ϥϕϧ͸লུ͢Δͷ͕‫׳‬श struct MyValue { // Int 型から自身の型へ変換するイニシャライザ init(_ value: Int) { } }

47.

‫ܕ‬ม‫׵‬ͷ࣮૷JO4XJGU ࣗ਎ͷ‫͔ܕ‬Βͷม‫ػ׵‬ೳΛఆٛ ⾣ ม‫׵‬ઌͷ‫͢૷࣮ʹܕ‬Δͷ͕‫׳‬श ⾣ ม‫׵‬ΠχγϟϥΠβΛ࢖ͬͯఆٛ͢Δ extension Int { // MyValue 型から自身の型 (Int) へ変換する init(_ value: MyValue) { } }

48.

‫ܕ‬ม‫׵‬ͷ࣮૷JO4XJGU ಠࣗͷม‫ߏػ׵‬Λ࢖͏ ⾣ ࣗ෼ࣗ਎Ͱ࣮૷ͨ͠‫ػ‬ೳΛ࢖͏ ⾣ 4XJGUඪ४ϥΠϒϥϦͷྲّྀͰม‫͖Ͱ׵‬Δ // Int から自分自身に変換 let value = MyValue(100) // 自分自身を Int に変換 let number = Int(value)

49.

‫ܕ‬ม‫׵‬ͷ࣮૷JO4XJGU ม‫ػ׵‬ೳͱී௨ͷॳ‫ظ‬ԽΛ۠ผͰ͖Δ ⾣ 'VMM8JEUIม‫׵‬͸ϥϕϧ໊Λ͚ͭͳ͍ ⾣ ͦΕҎ֎Ͱ͸ϥϕϧ໊Λ͚ͭΔ‫׳‬श struct MyValue { // ラベル名を伴う場合は Full-Width 変換ではない init(locale: NSLocale) {… } // これがもし Full-Width 変換なら // NSPoint に変換イニシャライザとして実装したい func toPoint() -> NSPoint { … } }

50.

͜͜·Ͱͷ·ͱΊ ‫ܕ‬ม‫׵‬ͷ࣮૷

51.

‫ܕ‬ม‫׵‬ͷ࣮૷ ҹ৅ͷ·ͱΊ 0CKFDUJWF$ 4XJGU ‫఺ى‬ ࣗ࡞‫ܕ‬Λ‫఺ى‬ ม‫׵‬ઌͷ‫ܕ‬Λ‫఺ى‬ ม‫ػ׵‬ೳͷ ଘࡏ৔ॴ ม‫ͨ·ݩ׵‬͸ม‫׵‬ઌ ม‫׵‬ઌ ଘࡏ͠ͳ͍৔߹΋͋Δ ଘࡏ͠ͳ͍৔߹΋͋Δ 'VMM8JEUI ม‫͔׵‬൱͔ ม‫׵‬ΠχγϟϥΠβͰද‫ݱ‬ ఆٛΛಡΜͰ૝૾͢Δ ଞ͸'VMM8JEUIͰ͸ͳ͍ ద੾ͳม‫ͳ ͕׵‬Μͱ͔͢Δ ม‫ͱ͍͜ͳ͖Ͱ׵‬Λ௨஌ Ͱ͖ͳ͍ͱ͖ ͋·Γྫ֎͸࢖Θͳ͍ ྫ֎ΤϥʔOJM

52.

‫ܕ‬ม‫׵‬ͷ࣮૷ ߏจͷ·ͱΊ 0CKFDUJWF$ 'VMM8JEUI ม‫׵‬ /BSSPX ม‫׵‬ ଞͷ‫΁ܕ‬ม‫׵‬ 'VMM8JEUI ม‫ࣦ׵‬ഊͷ ߟྀ ΠχγϟϥΠβ ΠχγϟϥΠβ ϝιου JOJUͰOJMΛฦ͢ख΋͋Δ͕ ී௨͸ͦΕΛͤͣɺ‫ؙ‬ΊࠐΉ 4XJGU ม‫׵‬ΠχγϟϥΠβ ʢ࠷ॳͷҾ਺͕ϥϕϧΛ࣋ͨͳ͍ʣ ΠχγϟϥΠβ ʢ࠷ॳͷҾ਺͕ϥϕϧΛ࣋ͭʣ ม‫׵‬ΠχγϟϥΠβ ʢม‫׵‬ઌͷ‫ܕ‬Λ֦ு࣮ͯ͠૷ʣ init / init? init … throws

53.

4XJGUͷΩϟετ 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ

54.

4XJGUͷΩϟετ ֓ཁ ⾣ ͋ΔΠϯελϯεΛ ࢦఆͨ͠‫ͯ͠ͱܕ‬ѻ͏ ⾣ ѻ͑ͳ͔ͬͨͱ͖͸Τϥʔѻ͍ ⾣ ΩϟετԋࢉࢠΛ࢖͏ w BT BT w JT w BT

55.

4XJGUͷΩϟετ BT ԋࢉࢠʹΑΔΩϟετ ⾣ ͋ΔΠϯελϯεΛࢦఆͨ͠‫ͯ͠ͱܕ‬ѻ͏ ⾣ ѻ͑ͳ͍৔߹͸OJMʹͳΔ ⾣ νΣοΫͱΩϟετΛಉ࣌ʹߦ͏ // 一般に Optional Binding とセットで使う if let number = instance as? NSData { } else { // キャストできなかった場合も想定できる }

56.

4XJGUͷΩϟετ BTԋࢉࢠʹΑΔΩϟετ ⾣ ͋ΔΠϯελϯεΛࢦఆͨ͠‫ͯ͠ͱܕ‬ѻ͏ ⾣ ࣮֬ʹѻ͑Δ৔߹ʹ‫͏࢖ͯͬݶ‬ ⾣ ࢖͏‫ػ‬ձ͸΄ͱΜͲͳ͍ҹ৅ // 確実にダウンキャスト出来る時にだけ使う let data = instance as! NSData // キャストできない場合は強制終了 let data = instance as! NSNumber &9$@#"%@*/4536$5*0/

57.

4XJGUͷΩϟετ JTԋࢉࢠʹΑΔΩϟετ൑ఆ ⾣ ͋ΔΠϯελϯεΛ ࢦఆͨ͠‫ͯ͠ͱܕ‬ѻ͑Δ͔൑ఆ ⾣ ࢖͏‫ػ‬ձ͸΄ͱΜͲͳ͍ҹ৅ // 確実にダウンキャスト出来るかを判定 if instance is NSData { // ここならキャストが確実にできる let data = instance as! NSData }

58.

4XJGUͷΩϟετ BTԋࢉࢠʹΑΔΩϟετ ⾣ ⾣ ໌Β͔ʹࣦഊ͠ͳ͍ΩϟετͰ࢖͏ w ΞοϓΩϟετ w ‫׵ޓ‬ੑͷ͋Δ‫΁ܕ‬ͷϒϦοδ w ϦςϥϧΛͲͷ‫ͯ͠ͱܕ‬ѻ͏͔ࢦఆ ୯७ʹ‫ܕ‬Λ໌‫͢ه‬Δͷ͕໨త

59.

4XJGUͷΩϟετ BTԋࢉࢠʹΑΔ ໌Β͔ͳΞοϓΩϟετ ⾣ ΞοϓΩϟετͷ࣮‫ݱ‬ੑ͸‫ܕ‬ઃ‫ʹܭ‬ΑΓ໌Β͔ ⾣ ੒൱͸‫ͣͤʹؾ‬ɺ‫͢ه໌͑͞ܕ‬Ε͹ྑ͍ let workData = NSMutableData() // 継承関係より NSData で扱えるのは明らか let data = workData as NSData

60.

4XJGUͷΩϟετ ෆ໌ྎͳΞοϓΩϟετ͸BT ԋࢉࢠΛ࢖͏ ⾣ Πϯελϯεͱͯ͠͸ΞοϓΩϟετͰ΋ ‫͔ܕ‬ΒਪଌͰ͖ͳ͚Ε͹ΩϟετԋࢉΛ࢖͏ // 中身的には NSMutableData 型でも、 let instance: AnyObject = NSMutableData() // 外見からは NSData にキャスト出来るか分からない // こういうときは as? または as! でのキャストが必要 let data = instance as? NSData

61.

4XJGUͷΩϟετ BTԋࢉࢠʹΑΔ ϒϦοδ ⾣ /44USJOHͱ4USJOH͸ϒϦοδͰ͖Δ ⾣ ੒൱͸‫ͣͤʹؾ‬ɺ‫͢ه໌͑͞ܕ‬Ε͹ྑ͍ let string = String() // ブリッジ機構は Swift 標準ライブラリが提供 let objcString = string as NSString

62.

4XJGUͷΩϟετ ϓϩτίϧ‫ܕ‬ͷѻ͍ʹ͍ͭͯ ⾣ ෇ଐ‫ܕ‬Λ࣋ͨͳ͍ϓϩτίϧ͸ ‫ͯ͠ͱܕ‬΋ѻ͑Δ ⾣ Ϋϥεͱಉ͡Α͏ʹѻ͑Δ w BTͱBT ͰΩϟετͰ͖Δ w ໌Β͔ͳΞοϓΩϟετ͸BTͰ࣮ࢪ

63.

͜͜·Ͱͷ·ͱΊ 4XJGUͷΩϟετ

64.

‫ܕ‬ม‫׵‬ͷ࣮૷ 4XJGUͷΩϟετ 0CKFDUJWF$ 4XJGU (SubClass*)instance instance as? SubClass ੒ޭ͢Δ͸ͣͷ (SubClass*)instance μ΢ϯΩϟετ instance as! SubClass ‫͔ܕ‬Β໌Β͔ͳ (BaseClass*)instance ΞοϓΩϟετ instance as BaseClass ‫͔ܕ‬Βਪଌෆೳͳ (BaseClass*)instance ΞοϓΩϟετ instance as? BaseClass ϒϦοδ (SomeClass*)instance instance as SomeClass Ωϟετͷ ੒ޭੑ൑ఆ isKindOfClass: conformsToProtocol: instance is SomeType μ΢ϯΩϟετ

65.

Ҏ্ɺ·ͱΊ

66.

0CKFDUJWF$ ͷΩϟετͱ 4XJGU ͷ‫ܕ‬ม‫׵‬Λൺ΂ͯΈΔ ·ͱΊ Ωϟετͱ‫ܕ‬ม‫׵‬   ϓϦϛςΟϒ‫ܕ‬ͷม‫׵‬  ΫϥεͷΩϟετ  'VMM8JEUIม‫ͱ׵‬/BSSPXม‫׵‬ ‫ܕ‬ม‫׵‬ͷ࣮૷    ͋Δ‫͔ܕ‬Βͷม‫͋׵‬Δ‫΁ܕ‬ͷม‫׵‬ 4XJGUͷΩϟετ  BT BTJTBT