135 Views
May 30, 16
スライド概要
AKIBA.swift 第2回 の発表資料です!
※ Docswell での公開に移行する直前の Slideshare での閲覧数は 8,719 でした。
正統派趣味人プログラマー。プログラミングとは幼馴染です。
0CKFDUJWF$ ͷΩϟετͱ 4XJGU ͷܕมΛൺͯΈΔ ",*#"TXJGUୈ̎ճ &;/&5۽୩༑ 4XJGU IUUQF[OFUKQ
۽୩༑ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ษڧձ ԣJ1IPOF։ൃऀษڧձ ΧδϡΞϧ4XJGUษڧձ ZJEFW ˏԣɾഅंಓ DTXJGU !ԣɾ੨༿ Θ͍Θ͍ɾΏΔ͘ɺJ1IPOF։ൃऀͷ ΈΜͳͰָ͘͠ա͢͝ͷ͕తͷձ ΏΔ͘ΈΜͳͰ4XJGUʹ͍ͭͯ ޠΒ͑Δ͕ཉͯ࢝͘͠Ίͨձ ୈ̎̐ճΛʹ։࠵ࠐݟΈ ୈ̕ճΛʹ։࠵༧ఆ
۽୩༑ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ ॻ੶ొஃ 9DPEFపఈղઆ .04" 9DPEFͷશػೳΛ పఈతʹղઆͨ͠ຊ 049J04ܥͷྺ࢙ਂ͍ ༗ྉձһ੍ͷษڧձ 9DPEFͰཱͭͣ ๏ਓձһଟ 紙版は絶版、電⼦書籍は販売中
۽୩༑ !FT@LVNBHBJ &;/&5IUUQF[OFUKQ J04 049 "QQMF8BUDIΞϓϦ $PEF1JFDF ͍ͭͷి ιʔείʔυΛ5XJUUFSͱ (JTUʹಉ࣌ߘͰ͖Δɻ ࣜࢉܭ͑ݟΔిΞϓϦɻ XBUDI04ରԠ ԻͰ࠶ୡΰου &;/&5*11IPOF ؆୯ૢ࡞Ͱ ࠶ୡͷਃ͠ࠐΈɻ J1IPOFͰͻ͔ΓిΛ͏ɻ ࣗ-"/͔Βͷར༻ઐ༻
$PEF1JFDFGPS04 9 ษڧձΛָ͠ΉΞϓϦ ιʔείʔυΛ5XJUUFSͱ(JTUʹಉ࣌ߘͰ͖Δ ษڧձͰݟΛΈΜͳͱڞ༗͍ͨ࣌͠ͱ͔ʹศརʂ Ͱ͖Δ͜ͱ BLJCBTXJGU
Ωϟετͱܕม 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ
Ωϟετͱܕม ඪ 0CKFDUJWF$ͱ4XJGUͷ ܕͷมํ๏Λͬ͘͟ΓൺΔ 0CKFDUJWF$ͱ4XJGUͰͷ ܕมͷงғؾΛோΊͯΈΔ 4XJGUʹ͓͚Δ ΩϟετͷجຊΛѲ͢Δ
0CKFDUJWF$ Ωϟετͱܕม
ΩϟετͱܕมJO0CKFDUJWF$ ֓ཁ ⾣ ͋ΔܕͷΛผͷͰܕද͠ݱ͢ ⾣ $4UZMF ͷ ΩϟετԋࢉࢠΛ͏ ⾣ ͕ ޠݴมػೳΛఏڙ w ϓϦϛςΟϒͳͷม w σʔλͷ࠶ղऍ w ΫϥεͷΩϟετ TUBUJDDBTU SFJOUFSQSFUFEDBTU VQEPXODBTU
ΩϟετͱܕมJO0CKFDUJWF$ ϓϦϛςΟϒͳΛมʢ໌ࣔΩϟετʣ ⾣ ΩϟετԋࢉࢠΛͬͯม͢Δ ⾣ ՄೳͳݶΓͰɺಉ͡ʹม͞ΕΔ NSInteger integerValue = 10; double doubleValue = 128.9; // 明示キャスト NSUInteger value1 = (NSUInteger)integerValue; NSInteger value2 = (NSInteger)doubleValue; char value3 = (char)integerValue; double value4 = (double)integerValue;
ΩϟετͱܕมJO0CKFDUJWF$ ϓϦϛςΟϒͳΛมʢ҉Ωϟετʣ ⾣ ΩϟετԋࢉࢠলུͰ͖Δ ⾣ ࠷ऴతͳʹܕԠͯࣗ͡ಈతʹม NSInteger integerValue = 10; double doubleValue = 128.9; // 暗黙キャスト NSUInteger value1 = integerValue; NSInteger value2 = doubleValue; char value3 = integerValue; double value4 = integerValue;
ΩϟετͱܕมJO0CKFDUJWF$ ͷม͕ࠩޡʹ࣌ੜ͡Δ߹ʹҙ ⾣ ม࣌ɺదٓௐ͞ΕΔʢൃࠩޡੜʣ ⾣ มઌͰΛද͕͋ͱ͍͜ͳ͖ͰݱΔ NSInteger integerValue = -8000000000000002345; double doubleValue = 123456789.935; // 誤差が出るキャスト NSInteger value1 = doubleValue; double value2 = integerValue; NSUInteger value3 = integerValue; short value4 = doubleValue; // 123456789 // -8000000000000002048 // 10446744073709549271u // -13035
ΩϟετͱܕมJO0CKFDUJWF$ ͢ࡏ͕ࠞܕʹ࣌ࢉܭΔͱ҉ม ⾣ ͢ࡏ͕ࠞܕΔͱɺͻͱͭͷʹܕม͞ΕΔ ⾣ ਫ਼ͷߴ͍ʹ ܕἧ͑ΒΕΔ doubleValue + floatValue floatValue + doubleValue doubleValue + longDoubleValue intValue + floatValue intValue + charValue intValue + longValue charValue + shortValue // double // double // long double // float // int // long // int
Ωϟετͱܕม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
Ωϟετͱܕม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
ΩϟετͱܕมJO0CKFDUJWF$ σʔλΛͦͷ··࠶ղऍʢϏοτΩϟετʣ ⾣ ϙΠϯλΛհͯ͠ɺσʔλͷղऍΛมߋ ⾣ σʔλΛͦͷ··ҙͷܕͷදͱݱΈͳ͢ short shortValue = 0x7FFF; long longValue = 0x12345678; // 再解釈キャスト short value1 = *(short*)&longValue; // 0x5678 long value2 = *(long*)&shortValue; // 0x6080000000207FFF double value3 = *(double*)&longValue; // 1.508974781700064e-315
ΩϟετͱܕมJO0CKFDUJWF$ Ϋϥεͷ໌ࣔΩϟετ ⾣ ͋ΔΫϥεܕΛผͷΫϥεͱܕΈͳ͢ ⾣ ΠϯελϯεࣗମԿมΘΒͳ͍ NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = (NSObject*)data; // ダウンキャスト NSMutableData *obj2 = (NSMutableData*)data;
ΩϟετͱܕมJO0CKFDUJWF$ Ϋϥεͷ҉ΞοϓΩϟετ ⾣ ΞοϓΩϟετ҉తʹΩϟετՄೳ ⾣ ܧঝؔͷఆٛʹΑΓ໌Β͔ NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = data; // ダウンキャストは明記が必要 NSMutableData *obj2 = (NSMutableData*)data;
ΩϟετͱܕมJO0CKFDUJWF$ ڥݟͷͳ͍ΫϥεΩϟετʹҙ ⾣ ͲΜͳΫϥεʹ໌ࣔΩϟετՄೳ ⾣ ΠϯελϯεࣗମԿมΘΒͳ͍ʂ NSString *obj = [[NSString alloc] init]; // 無関係な型へのキャスト NSNumber *number = (NSNumber*)obj; // メソッドが存在しなければ実行時エラー NSString *text = [number descriptionWithLocale: nil]; VOSFDPHOJ[FETFMFDUPSTFOUUPJOTUBODF
ΩϟετͱܕมJO0CKFDUJWF$ ͋ΔΫϥεͷΩϟετ͕Մೳͳ͜ͱΛอূ ⾣ ΩϟετՄೳͰ͋Δ͔Λఆ ⾣ /40CKFDU͕ఆػೳΛఏڙ id object; // 可能性の判定 if ([object isKindOfClass:[NSNumber class]]) { // 整合性が約束されればキャストを実施 NSNumber *number = (NSNumber*)object; }
Ωϟετͱܕม 0CKFDUJWF$ʹ͓͚Δҹ
Ωϟετͱܕม 0CKFDUJWF$ʹ͓͚ΔΩϟετͷҹ ⾣ ۃੵ͕ޠݴతʹࣗಈมͯ͘͠ΕΔ ⾣ దͳมޚ੍ϓϩάϥϚʔͷ ⾣ ΩϟετԋࢉࢠΛ੍ͬͯ͢ޚΔ ⾣ ෳࡶͳҹ w ࣗಈมࣔ໌ͱมͷஅ͕ඞཁ w มࣦʹഊͨ͠߹ʹ͍͘ʹ͖ͮؾ w ͱΫϥεͰมॲཧʹ౷Ұ͍ͳ͕ײ
4XJGU Ωϟετͱܕม
ΩϟετͱܕมJO4XJGU ֓ཁ ⾣ ผͷܕදʹݱม͢Δ w 'VMM8JEUIม w /BSSPXม w ࠶ղऍʹΑΔม ⾣ ผͷʹܕΩϟετ͢Δ w ΫϥεܕͷΩϟετ w ϓϩτίϧܕͷΩϟετ w ϒϦοδ VQEPXODBTU
Ωϟετͱܕม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)
Ωϟετͱܕม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
ΩϟετͱܕมJO4XJGU /BSSPXมʢഁյΛ͏มʣ ⾣ ҙຯ͕มΘΔՄೳੑͷ͋Δܕม ⾣ Ҿϥϕϧ͖ΠχγϟϥΠβͰ࣮ࢪ let source: UInt = 18446744073709551000 // 型を変換 let value1 = Int(bitPattern: source) // -616 let value2 = Int8(truncatingBitPattern: source) // -104
Ωϟετͱܕม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
ΩϟετͱܕมJO4XJGU ΫϥεͷΩϟετ ⾣ ͋ΔΫϥεܕΛผͷΫϥεͯ͠ͱܕѻ͏ ⾣ as as? as!ԋࢉࢠΛͬͯΩϟετ͢Δ let instance: NSData = NSMutableData() // アップキャスト let object1 = instance as NSObject // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData
ΩϟετͱܕมJO4XJGU Ϋϥεͷ҉ΞοϓΩϟετ ⾣ ΞοϓΩϟετ҉తʹΩϟετՄೳ ⾣ ܧঝؔͷఆٛʹΑΓ໌Β͔ let instance: NSData = NSMutableData() // アップキャスト let object1: NSObject = instance // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData
ΩϟετͱܕมJO4XJGU ؔͳ͍ΫϥεͷΩϟετ ⾣ ෆదͳΫϥεʹ໌ࣔΩϟετ͢ΔͱOJM ⾣ Ωϟετʹࣦഊͨ͜͠ͱ͕໌ྎ let object = NSString() // 無関係な型へのキャスト let number1 = object as? NSData // nil let number2 = object as! NSData // ERROR &9$@#"%@*/4536$5*0/
Ωϟετͱܕม 4XJGUʹ͓͚Δҹ
Ωϟετͱܕม 4XJGUʹ͓͚Δܕมͷҹ ⾣ ʹޠݴΑΓมޚ੍Λڧཁ͞ΕΔ ⾣ దͳมޚ੍ϓϩάϥϚʔͷ ⾣ มΠχγϟϥΠβΩϟετԋࢉࢠͰ੍ޚ ⾣ γϯϓϧͰ໌ྎͳҹ w ݪଇɺ໌ࣔมͷஅ͕ඞཁ w มࣦʹഊͨ͜͠ͱ͕ଈ࠲ʹ͔Δ w શମతʹ౷Ұײͷ͋Δࡌه
͜͜·Ͱͷ·ͱΊ Ωϟετͱܕม
Ωϟετͱܕม ҹͷ·ͱΊ 0CKFDUJWF$ ҹ 4XJGU ෳࡶ γϯϓϧ ͱͰܕҹ͕ҟͳΔ ౷Ұ͕͋ײΔ దͳมΛ ϓϩάϥϚʔ͕ෛ͏ ࣮ࢪ͢Δ ϓϩάϥϚʔ͕ෛ͏ มํ๏ͷ ఆٛͱద༻ نͰ༷ޠݴఆ ੵۃతʹࣗಈม نͯ͠ͱ࣮͕ܕఆ ϓϩάϥϚʔ͕໌ࣔม มखஈ Ωϟετԋࢉࢠ ֤͕ͭ࣋ܕछػೳ Ωϟετԋࢉࢠ มΠχγϟϥΠβ దͳม͕ ߦڧಥഁ Ͱ͖ͳ͍ͱ͖ มͱ͍͜ͳ͖ͰΛ௨ ྫ֎ΤϥʔOJM
Ωϟετͱܕม ߏจͷ·ͱΊ 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)
ܕมͷ࣮ 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ
0CKFDUJWF$ ܕมͷ࣮
ܕมͷ࣮JO0CKFDUJWF$ ֓ཁ ⾣ ࣗ࡞Ϋϥεʹ 'VMM8JEUIมػೳΛ࣋ͨͤΔ ⾣ ࣗ࡞ΫϥεΛத৺ʹ૬ޓม͢Δ w ඞཁͳ͚Εยଆม ҙࣝ ⾣ ࣗ࡞Ϋϥε͕Λ࣋ͬͯఏ͢ڙΔ
ܕมͷ࣮JO0CKFDUJWF$ ࣗͷܕͷมػೳΛఆٛ ⾣ ΠχγϟϥΠβΛͬͯఆٛ͢Δ ⾣ ໊લҰൠʹl8JUI ໊ܕzΛ͚ͭΔ༷ࢠ @interface ESMyObject : NSObject // NSInteger 型から自分の型に変換する - (instancetype)initWithInteger:(NSInteger)value; @end
ܕมͷ࣮JO0CKFDUJWF$ ࣗͷ͔ܕΒͷมػೳΛఆٛ ⾣ ࣗ࡞ͷ࣮͢ʹܕΔͷ͕Ұൠత ⾣ ໊લlUP ໊ܕz͕͔Γͦ͢͏ @interface ESMyObject : NSObject // 自分自身から NSInteger に変換 - (NSInteger)toInteger; @end
ͷ؍JO0CKFDUJWF$ ಠࣗͷมߏػΛ͏ ⾣ ࣗࣗͰ࣮ͨ͠ػೳΛ͏ ⾣ ϓϦϛςΟϒܕͷΩϟετͱҹ͕ҟͳΔ // NSInteger から自分自身に変換 ESMyObject *object = [[ESMyObject alloc] initWithInteger: 10]; // 自分自身を NSInteger に変換 NSInteger value = [object toInteger];
ͷ؍JO0CKFDUJWF$ มػೳͱී௨ͷػೳͷ۠ผ͠ʹ͍͘ ⾣ 'VMM8JEUIมػೳ͕ଞͷػೳͱࠞࡏ ⾣ ໊લ͔Β۠ผ͠ʹ͍͘ @interface ESMyObject : NSObject // NSLocale からの変換? - (instancetype)initWithLocale:(NSLocale)locale; // 自分自身から NSPoint への変換? - (NSPoint)toPoint; @end
4XJGU ܕมͷ࣮
ܕมͷ࣮JO4XJGU ֓ཁ ⾣ ࣗ࡞'ʹܕVMM8JEUIมΛ࣋ͨͤΔ ⾣ ࣗ࡞Ͳʹܕͷ͔ܕΒม͖ͰΔ͔໌ه ⾣ ૬ޓม͕ඞཁͳ߹มઌʹɺ ࣗ࡞͔ܕΒͷมػೳΛ࣮ ҙࣝ ⾣ มઌ͕Λ࣋ͬͯఏ͢ڙΔ
ܕมͷ࣮JO4XJGU ࣗͷܕͷมػೳΛఆٛ ⾣ มΠχγϟϥΠβΛͬͯఆٛ͢Δ ⾣ ࠷ॳͷҾϥϕϧলུ͢Δͷ͕׳श struct MyValue { // Int 型から自身の型へ変換するイニシャライザ init(_ value: Int) { } }
ܕมͷ࣮JO4XJGU ࣗͷ͔ܕΒͷมػೳΛఆٛ ⾣ มઌͷ࣮͢ʹܕΔͷ͕׳श ⾣ มΠχγϟϥΠβΛͬͯఆٛ͢Δ extension Int { // MyValue 型から自身の型 (Int) へ変換する init(_ value: MyValue) { } }
ܕมͷ࣮JO4XJGU ಠࣗͷมߏػΛ͏ ⾣ ࣗࣗͰ࣮ͨ͠ػೳΛ͏ ⾣ 4XJGUඪ४ϥΠϒϥϦͷྲّྀͰม͖ͰΔ // Int から自分自身に変換 let value = MyValue(100) // 自分自身を Int に変換 let number = Int(value)
ܕมͷ࣮JO4XJGU มػೳͱී௨ͷॳظԽΛ۠ผͰ͖Δ ⾣ 'VMM8JEUIมϥϕϧ໊Λ͚ͭͳ͍ ⾣ ͦΕҎ֎Ͱϥϕϧ໊Λ͚ͭΔ׳श struct MyValue { // ラベル名を伴う場合は Full-Width 変換ではない init(locale: NSLocale) {… } // これがもし Full-Width 変換なら // NSPoint に変換イニシャライザとして実装したい func toPoint() -> NSPoint { … } }
͜͜·Ͱͷ·ͱΊ ܕมͷ࣮
ܕมͷ࣮ ҹͷ·ͱΊ 0CKFDUJWF$ 4XJGU ى ࣗ࡞ܕΛى มઌͷܕΛى มػೳͷ ଘࡏॴ มͨ·ݩมઌ มઌ ଘࡏ͠ͳ͍߹͋Δ ଘࡏ͠ͳ͍߹͋Δ 'VMM8JEUI ม͔൱͔ มΠχγϟϥΠβͰදݱ ఆٛΛಡΜͰ૾͢Δ ଞ'VMM8JEUIͰͳ͍ దͳมͳ ͕Μͱ͔͢Δ มͱ͍͜ͳ͖ͰΛ௨ Ͱ͖ͳ͍ͱ͖ ͋·Γྫ֎Θͳ͍ ྫ֎ΤϥʔOJM
ܕมͷ࣮ ߏจͷ·ͱΊ 0CKFDUJWF$ 'VMM8JEUI ม /BSSPX ม ଞͷܕม 'VMM8JEUI มࣦഊͷ ߟྀ ΠχγϟϥΠβ ΠχγϟϥΠβ ϝιου JOJUͰOJMΛฦ͢ख͋Δ͕ ී௨ͦΕΛͤͣɺؙΊࠐΉ 4XJGU มΠχγϟϥΠβ ʢ࠷ॳͷҾ͕ϥϕϧΛ࣋ͨͳ͍ʣ ΠχγϟϥΠβ ʢ࠷ॳͷҾ͕ϥϕϧΛ࣋ͭʣ มΠχγϟϥΠβ ʢมઌͷܕΛ֦ு࣮ͯ͠ʣ init / init? init … throws
4XJGUͷΩϟετ 4XJGU ͱ 0CKFDUJWF$ ͱͷจ๏ൺֱ
4XJGUͷΩϟετ ֓ཁ ⾣ ͋ΔΠϯελϯεΛ ࢦఆͨͯ͠͠ͱܕѻ͏ ⾣ ѻ͑ͳ͔ͬͨͱ͖Τϥʔѻ͍ ⾣ ΩϟετԋࢉࢠΛ͏ w BT BT w JT w BT
4XJGUͷΩϟετ BT ԋࢉࢠʹΑΔΩϟετ ⾣ ͋ΔΠϯελϯεΛࢦఆͨͯ͠͠ͱܕѻ͏ ⾣ ѻ͑ͳ͍߹OJMʹͳΔ ⾣ νΣοΫͱΩϟετΛಉ࣌ʹߦ͏ // 一般に Optional Binding とセットで使う if let number = instance as? NSData { } else { // キャストできなかった場合も想定できる }
4XJGUͷΩϟετ BTԋࢉࢠʹΑΔΩϟετ ⾣ ͋ΔΠϯελϯεΛࢦఆͨͯ͠͠ͱܕѻ͏ ⾣ ࣮֬ʹѻ͑Δ߹ʹ͏ͯͬݶ ⾣ ͏ػձ΄ͱΜͲͳ͍ҹ // 確実にダウンキャスト出来る時にだけ使う let data = instance as! NSData // キャストできない場合は強制終了 let data = instance as! NSNumber &9$@#"%@*/4536$5*0/
4XJGUͷΩϟετ JTԋࢉࢠʹΑΔΩϟετఆ ⾣ ͋ΔΠϯελϯεΛ ࢦఆͨͯ͠͠ͱܕѻ͑Δ͔ఆ ⾣ ͏ػձ΄ͱΜͲͳ͍ҹ // 確実にダウンキャスト出来るかを判定 if instance is NSData { // ここならキャストが確実にできる let data = instance as! NSData }
4XJGUͷΩϟετ BTԋࢉࢠʹΑΔΩϟετ ⾣ ⾣ ໌Β͔ʹࣦഊ͠ͳ͍ΩϟετͰ͏ w ΞοϓΩϟετ w ޓੑͷ͋ΔܕͷϒϦοδ w ϦςϥϧΛͲͷͯ͠ͱܕѻ͏͔ࢦఆ ୯७ʹܕΛ໌͢هΔͷ͕త
4XJGUͷΩϟετ BTԋࢉࢠʹΑΔ ໌Β͔ͳΞοϓΩϟετ ⾣ ΞοϓΩϟετͷ࣮ݱੑܕઃʹܭΑΓ໌Β͔ ⾣ ൱ͣͤʹؾɺ͢ه໌͑͞ܕΕྑ͍ let workData = NSMutableData() // 継承関係より NSData で扱えるのは明らか let data = workData as NSData
4XJGUͷΩϟετ ෆ໌ྎͳΞοϓΩϟετBT ԋࢉࢠΛ͏ ⾣ Πϯελϯεͱͯ͠ΞοϓΩϟετͰ ͔ܕΒਪଌͰ͖ͳ͚ΕΩϟετԋࢉΛ͏ // 中身的には NSMutableData 型でも、 let instance: AnyObject = NSMutableData() // 外見からは NSData にキャスト出来るか分からない // こういうときは as? または as! でのキャストが必要 let data = instance as? NSData
4XJGUͷΩϟετ BTԋࢉࢠʹΑΔ ϒϦοδ ⾣ /44USJOHͱ4USJOHϒϦοδͰ͖Δ ⾣ ൱ͣͤʹؾɺ͢ه໌͑͞ܕΕྑ͍ let string = String() // ブリッジ機構は Swift 標準ライブラリが提供 let objcString = string as NSString
4XJGUͷΩϟετ ϓϩτίϧܕͷѻ͍ʹ͍ͭͯ ⾣ ଐܕΛ࣋ͨͳ͍ϓϩτίϧ ͯ͠ͱܕѻ͑Δ ⾣ Ϋϥεͱಉ͡Α͏ʹѻ͑Δ w BTͱBT ͰΩϟετͰ͖Δ w ໌Β͔ͳΞοϓΩϟετBTͰ࣮ࢪ
͜͜·Ͱͷ·ͱΊ 4XJGUͷΩϟετ
ܕมͷ࣮ 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 μϯΩϟετ
Ҏ্ɺ·ͱΊ
0CKFDUJWF$ ͷΩϟετͱ 4XJGU ͷܕมΛൺͯΈΔ ·ͱΊ Ωϟετͱܕม ϓϦϛςΟϒܕͷม ΫϥεͷΩϟετ 'VMM8JEUIมͱ/BSSPXม ܕมͷ࣮ ͋Δ͔ܕΒͷม͋Δܕͷม 4XJGUͷΩϟετ BT BTJTBT