---
title: Objective-C のキャストと Swift の型変換を比べてみる #akibaswift
tags:  #swift #akiba.swift #objective-c  
author: [熊谷友宏](https://convert.docswell.com/user/es_kumagai)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/L7LPQ21RJR.jpg?width=480
description: AKIBA.swift 第２回 の発表資料です！  ※ Docswell での公開に移行する直前の Slideshare での閲覧数は 8,719 でした。
published: May 30, 16
canonical: https://convert.docswell.com/s/es_kumagai/KN1JGL-akibaswiftobjective-cswift-160530122728
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/L7LPQ21RJR.jpg)

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


# Page. 2

![Page Image](https://bcdn.docswell.com/page/4EM418WPJW.jpg)

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


# Page. 3

![Page Image](https://bcdn.docswell.com/page/PERWL5YYJ9.jpg)

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


# Page. 4

![Page Image](https://bcdn.docswell.com/page/P7XPWKG4JX.jpg)

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


# Page. 5

![Page Image](https://bcdn.docswell.com/page/37KDV54PED.jpg)

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


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LJ3RMKL4E5.jpg)

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


# Page. 7

![Page Image](https://bcdn.docswell.com/page/8JDY63N5JG.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬
໨ඪ

0CKFDUJWF$ͱ4XJGUͷ
‫ܕ‬ͷม‫ํ׵‬๏Λͬ͘͟Γൺ΂Δ

0CKFDUJWF$ͱ4XJGUͰͷ
‫ܕ‬ม‫׵‬ͷงғ‫ؾ‬ΛோΊͯΈΔ

4XJGUʹ͓͚Δ
Ωϟετͷ‫ج‬ຊΛ೺Ѳ͢Δ


# Page. 8

![Page Image](https://bcdn.docswell.com/page/VEP6Y45D78.jpg)

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


# Page. 9

![Page Image](https://bcdn.docswell.com/page/27V3GXPGJQ.jpg)

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


# Page. 10

![Page Image](https://bcdn.docswell.com/page/5JG38VQDEL.jpg)

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


# Page. 11

![Page Image](https://bcdn.docswell.com/page/47Q596KXEP.jpg)

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


# Page. 12

![Page Image](https://bcdn.docswell.com/page/KE49X4P2J1.jpg)

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


# Page. 13

![Page Image](https://bcdn.docswell.com/page/L71KN49KEG.jpg)

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


# Page. 14

![Page Image](https://bcdn.docswell.com/page/G7WD4XQPE2.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬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


# Page. 15

![Page Image](https://bcdn.docswell.com/page/4JZG26W673.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬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


# Page. 16

![Page Image](https://bcdn.docswell.com/page/YE6YV2GLJV.jpg)

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


# Page. 17

![Page Image](https://bcdn.docswell.com/page/GE5GD2VME4.jpg)

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


# Page. 18

![Page Image](https://bcdn.docswell.com/page/972Y843R7R.jpg)

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


# Page. 19

![Page Image](https://bcdn.docswell.com/page/DJYG6M15JM.jpg)

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


# Page. 20

![Page Image](https://bcdn.docswell.com/page/V7NGZW24E8.jpg)

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


# Page. 21

![Page Image](https://bcdn.docswell.com/page/YJ9WZX14J3.jpg)

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


# Page. 22

![Page Image](https://bcdn.docswell.com/page/GJ8N124VED.jpg)

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


# Page. 23

![Page Image](https://bcdn.docswell.com/page/LJLPQ26RER.jpg)

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


# Page. 24

![Page Image](https://bcdn.docswell.com/page/47M4185PEW.jpg)

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


# Page. 25

![Page Image](https://bcdn.docswell.com/page/P7RWL53YE9.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬JO4XJGU
&#039;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)


# Page. 26

![Page Image](https://bcdn.docswell.com/page/PJXPWK44EX.jpg)

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


# Page. 27

![Page Image](https://bcdn.docswell.com/page/3JKDV5ZP7D.jpg)

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


# Page. 28

![Page Image](https://bcdn.docswell.com/page/LE3RMKD475.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬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


# Page. 29

![Page Image](https://bcdn.docswell.com/page/8EDY63P5EG.jpg)

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


# Page. 30

![Page Image](https://bcdn.docswell.com/page/V7P6Y4NDJ8.jpg)

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


# Page. 31

![Page Image](https://bcdn.docswell.com/page/2JV3GXKGEQ.jpg)

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


# Page. 32

![Page Image](https://bcdn.docswell.com/page/5EG38V9D7L.jpg)

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


# Page. 33

![Page Image](https://bcdn.docswell.com/page/4JQ596WX7P.jpg)

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


# Page. 34

![Page Image](https://bcdn.docswell.com/page/K749X4K2E1.jpg)

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


# Page. 35

![Page Image](https://bcdn.docswell.com/page/LJ1KN4XK7G.jpg)

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


# Page. 36

![Page Image](https://bcdn.docswell.com/page/GJWD4XNP72.jpg)

Ωϟετͱ‫ܕ‬ม‫׵‬
ߏจͷ·ͱΊ
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*)&amp;value
ϏοτΩϟετ
unsafeBitCast(
value, Double.self)


# Page. 37

![Page Image](https://bcdn.docswell.com/page/4EZG2636J3.jpg)

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


# Page. 38

![Page Image](https://bcdn.docswell.com/page/Y76YV2XLEV.jpg)

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


# Page. 39

![Page Image](https://bcdn.docswell.com/page/G75GD2XM74.jpg)

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


# Page. 40

![Page Image](https://bcdn.docswell.com/page/9J2Y84XRJR.jpg)

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


# Page. 41

![Page Image](https://bcdn.docswell.com/page/DEYG6M85EM.jpg)

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


# Page. 42

![Page Image](https://bcdn.docswell.com/page/VJNGZWQ478.jpg)

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


# Page. 43

![Page Image](https://bcdn.docswell.com/page/YE9WZXD4E3.jpg)

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


# Page. 44

![Page Image](https://bcdn.docswell.com/page/GE8N123V7D.jpg)

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


# Page. 45

![Page Image](https://bcdn.docswell.com/page/LELPQ2VR7R.jpg)

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


# Page. 46

![Page Image](https://bcdn.docswell.com/page/4JM418GP7W.jpg)

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


# Page. 47

![Page Image](https://bcdn.docswell.com/page/PJRWL5ZY79.jpg)

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


# Page. 48

![Page Image](https://bcdn.docswell.com/page/PEXPWK947X.jpg)

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


# Page. 49

![Page Image](https://bcdn.docswell.com/page/3EKDV5PPJD.jpg)

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


# Page. 50

![Page Image](https://bcdn.docswell.com/page/L73RMKX4J5.jpg)

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


# Page. 51

![Page Image](https://bcdn.docswell.com/page/87DY63257G.jpg)

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


# Page. 52

![Page Image](https://bcdn.docswell.com/page/VJP6Y41DE8.jpg)

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


# Page. 53

![Page Image](https://bcdn.docswell.com/page/2EV3GXYG7Q.jpg)

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


# Page. 54

![Page Image](https://bcdn.docswell.com/page/57G38VWDJL.jpg)

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


# Page. 55

![Page Image](https://bcdn.docswell.com/page/4EQ5963XJP.jpg)

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


# Page. 56

![Page Image](https://bcdn.docswell.com/page/KJ49X41271.jpg)

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


# Page. 57

![Page Image](https://bcdn.docswell.com/page/LE1KN4GKJG.jpg)

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


# Page. 58

![Page Image](https://bcdn.docswell.com/page/GEWD4XKPJ2.jpg)

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


# Page. 59

![Page Image](https://bcdn.docswell.com/page/47ZG26Z6E3.jpg)

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


# Page. 60

![Page Image](https://bcdn.docswell.com/page/YJ6YV2ZL7V.jpg)

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


# Page. 61

![Page Image](https://bcdn.docswell.com/page/GJ5GD2WMJ4.jpg)

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


# Page. 62

![Page Image](https://bcdn.docswell.com/page/LE3RMK4975.jpg)

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


# Page. 63

![Page Image](https://bcdn.docswell.com/page/8EDY63Q8EG.jpg)

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


# Page. 64

![Page Image](https://bcdn.docswell.com/page/V7P6Y4LWJ8.jpg)

‫ܕ‬ม‫׵‬ͷ࣮૷
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
μ΢ϯΩϟετ


# Page. 65

![Page Image](https://bcdn.docswell.com/page/2JV3GXQ9EQ.jpg)

Ҏ্ɺ·ͱΊ


# Page. 66

![Page Image](https://bcdn.docswell.com/page/5EG38VW47L.jpg)

0CKFDUJWF$ ͷΩϟετͱ
4XJGU ͷ‫ܕ‬ม‫׵‬Λൺ΂ͯΈΔ
·ͱΊ
Ωϟετͱ‫ܕ‬ม‫׵‬


ϓϦϛςΟϒ‫ܕ‬ͷม‫׵‬

ΫϥεͷΩϟετ

&#039;VMM8JEUIม‫ͱ׵‬/BSSPXม‫׵‬
‫ܕ‬ม‫׵‬ͷ࣮૷



͋Δ‫͔ܕ‬Βͷม‫͋׵‬Δ‫΁ܕ‬ͷม‫׵‬
4XJGUͷΩϟετ

BT BTJTBT


