SlideShare une entreprise Scribd logo
1  sur  66
Télécharger pour lire hors ligne



 

紙版は絶版、電⼦書籍は販売中








NSInteger integerValue = 10;
double doubleValue = 128.9;
// 明示キャスト
NSUInteger value1 = (NSUInteger)integerValue;
NSInteger value2 = (NSInteger)doubleValue;
char value3 = (char)integerValue;
double value4 = (double)integerValue;
NSInteger integerValue = 10;
double doubleValue = 128.9;
// 暗黙キャスト
NSUInteger value1 = integerValue;
NSInteger value2 = doubleValue;
char value3 = integerValue;
double value4 = integerValue;
NSInteger integerValue = -8000000000000002345;
double doubleValue = 123456789.935;
// 誤差が出るキャスト
NSInteger value1 = doubleValue; // 123456789
double value2 = integerValue; // -8000000000000002048
NSUInteger value3 = integerValue; // 10446744073709549271u
short value4 = doubleValue; // -13035
doubleValue + floatValue // double
floatValue + doubleValue // double
doubleValue + longDoubleValue // long double
intValue + floatValue // float
intValue + charValue // int
intValue + longValue // long
charValue + shortValue // int
1 / 3.0 // 0.3333333333333333
1 / 3.0f // 0.33333333f
1 / 3 // 0
1 / 3.0 == 1 / 3 // false
1 / 3.0 == 1 / 3.0f // false
int a = 1, b = 3, c = 5, d = 4;
// 明示キャストによる制御
c * (a / b * d) // 0
c * (a / (double)b * d) // 6.666666666666666
c * (int)(a / (double)b * d) // 5
(int)(c * ((double)a / b * d)) // 6
c * (double)(a / b) * d // 0
short shortValue = 0x7FFF;
long longValue = 0x12345678;
// 再解釈キャスト
short value1 = *(short*)&longValue; // 0x5678
long value2 = *(long*)&shortValue; // 0x6080000000207FFF
double value3 = *(double*)&longValue; // 1.508974781700064e-315
NSData *data = [[NSMutableData alloc] init];
// アップキャスト
NSObject *obj1 = (NSObject*)data;
// ダウンキャスト
NSMutableData *obj2 = (NSMutableData*)data;
NSData *data = [[NSMutableData alloc] init];
// アップキャスト
NSObject *obj1 = data;
// ダウンキャストは明記が必要
NSMutableData *obj2 = (NSMutableData*)data;
NSString *obj = [[NSString alloc] init];
// 無関係な型へのキャスト
NSNumber *number = (NSNumber*)obj;
// メソッドが存在しなければ実行時エラー
NSString *text = [number descriptionWithLocale: nil];
id object;
// 可能性の判定
if ([object isKindOfClass:[NSNumber class]])
{
// 整合性が約束されればキャストを実施
NSNumber *number = (NSNumber*)object;
}
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)
let sourceValue: UInt = 18446744073709551615
// 変換できないとき
let value1 = Int(sourceValue)
let value2 = Int("120x") // nil

let value3 = try MyValue(sourceValue) // Error
let source: UInt = 18446744073709551000
// 型を変換
let value1 = Int(bitPattern: source) // -616
let value2 = Int8(truncatingBitPattern:source) // -104
let source: Int64 = 0x12345678
// 再解釈
var value1 = unsafeBitCast(source, Double.self)
// 1.508974781700064e-315
var value2 = unsafeBitCast(source, Int32.self)
as as? as!
let instance: NSData = NSMutableData()
// アップキャスト
let object1 = instance as NSObject
// ダウンキャスト
let object2 = instance as? NSMutableData
let object2 = instance as! NSMutableData
let instance: NSData = NSMutableData()
// アップキャスト
let object1: NSObject = instance
// ダウンキャスト
let object2 = instance as? NSMutableData
let object2 = instance as! NSMutableData
let object = NSString()
// 無関係な型へのキャスト
let number1 = object as? NSData // nil
let number2 = object as! NSData // ERROR

 




 



(int)value Int(value)
[instance toDouble] Double(instance)
(SubClass*)object
(BaseClass*)object
object as? SubClass
object as BaseClass

 [object isKindOfClass:

[SomeClass class]]
if let obj = object

as? SomeClass {


*(double*)&value
unsafeBitCast(
value, Double.self)


@interface ESMyObject : NSObject
// NSInteger 型から自分の型に変換する
- (instancetype)initWithInteger:(NSInteger)value;
@end
@interface ESMyObject : NSObject
// 自分自身から NSInteger に変換
- (NSInteger)toInteger;
@end
// NSInteger から自分自身に変換
ESMyObject *object
= [[ESMyObject alloc] initWithInteger: 10];
// 自分自身を NSInteger に変換
NSInteger value = [object toInteger];
@interface ESMyObject : NSObject
// NSLocale からの変換?
- (instancetype)initWithLocale:(NSLocale)locale;
// 自分自身から NSPoint への変換?
- (NSPoint)toPoint;
@end


struct MyValue {
// Int 型から自身の型へ変換するイニシャライザ
init(_ value: Int) {
}
}
extension Int {
// MyValue 型から自身の型 (Int) へ変換する
init(_ value: MyValue) {
}
}
// Int から自分自身に変換
let value = MyValue(100)
// 自分自身を Int に変換
let number = Int(value)
struct MyValue {
// ラベル名を伴う場合は Full-Width 変換ではない
init(locale: NSLocale) {…}
// これがもし Full-Width 変換なら

// NSPoint に変換イニシャライザとして実装したい
func toPoint() -> NSPoint {…}
}

 
 


 










 
 init / init?

init … throws


// 一般に Optional Binding とセットで使う
if let number = instance as? NSData {
}
else {
// キャストできなかった場合も想定できる
}
// 確実にダウンキャスト出来る時にだけ使う
let data = instance as! NSData
// キャストできない場合は強制終了
let data = instance as! NSNumber
// 確実にダウンキャスト出来るかを判定
if instance is NSData {
// ここならキャストが確実にできる
let data = instance as! NSData
}


let workData = NSMutableData()
// 継承関係より NSData で扱えるのは明らか
let data = workData as NSData
// 中身的には NSMutableData 型でも、
let instance: AnyObject = NSMutableData()
// 外見からは NSData にキャスト出来るか分からない

// こういうときは as? または as! でのキャストが必要
let data = instance as? NSData


let string = String()
// ブリッジ機構は Swift 標準ライブラリが提供
let objcString = string as NSString


(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
Objective-C のキャストと Swift の型変換を比べてみる #akibaswift
Objective-C のキャストと Swift の型変換を比べてみる #akibaswift

Contenu connexe

Tendances

【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!デベロッパーネットワーク
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと増田 亨
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす増田 亨
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」U-dai Yokoyama
 
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計de:code 2017
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話Takuto Wada
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し増田 亨
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテストTakuto Wada
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だIwao Harada
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善増田 亨
 
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなすUnity Technologies Japan K.K.
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~ProjectAsura
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策Unity Technologies Japan K.K.
 

Tendances (20)

【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったことドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
 
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
[AC05] マイクロサービスは分割がキモ!基幹システムのためのドメイン駆動設計
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
 
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
 
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探しリッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
 
私にとってのテスト
私にとってのテスト私にとってのテスト
私にとってのテスト
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
モデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だモデリングもしないでアジャイルとは何事だ
モデリングもしないでアジャイルとは何事だ
 
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
【Unity道場スペシャル 2017博多】TextMesh Pro を使いこなす
 
Riderはいいぞ!
Riderはいいぞ!Riderはいいぞ!
Riderはいいぞ!
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
【Unity道場スペシャル 2017京都】スマホゲーム開発者なら知っておくべきチートのリスク&対策
 

En vedette

俺のManaged Objectの使い方は間違っていた
俺のManaged Objectの使い方は間違っていた俺のManaged Objectの使い方は間違っていた
俺のManaged Objectの使い方は間違っていたShingo Sato
 
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileNS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileTomohiro Kumagai
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftTomohiro Kumagai
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsTomohiro Kumagai
 
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法Kenji Tanaka
 
RDRA DDD Agile
RDRA DDD AgileRDRA DDD Agile
RDRA DDD Agile増田 亨
 
Blending Culture in Twitter Client
Blending Culture in Twitter ClientBlending Culture in Twitter Client
Blending Culture in Twitter ClientKenji Tanaka
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
 
勉強会のこちら側とあちら側
勉強会のこちら側とあちら側勉強会のこちら側とあちら側
勉強会のこちら側とあちら側Tomoki Hasegawa
 
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swiftTomohiro Kumagai
 
#yidev 第25回勉強会 オープニング
#yidev 第25回勉強会 オープニング#yidev 第25回勉強会 オープニング
#yidev 第25回勉強会 オープニングTomohiro Kumagai
 
あなたのオブジェクト指向はオブジェクト指向ではないかもしれない
あなたのオブジェクト指向はオブジェクト指向ではないかもしれないあなたのオブジェクト指向はオブジェクト指向ではないかもしれない
あなたのオブジェクト指向はオブジェクト指向ではないかもしれない康廣 木目沢
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌YujiSoftware
 
Java in the Past, Java in the Future
Java in the Past, Java in the FutureJava in the Past, Java in the Future
Java in the Past, Java in the FutureYuichi Sakuraba
 
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swiftみんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swiftTomohiro Kumagai
 
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 5th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swiftTomohiro Kumagai
 
バ、バカな...!ハッカソンの中で成長しているだと...!?
バ、バカな...!ハッカソンの中で成長しているだと...!?バ、バカな...!ハッカソンの中で成長しているだと...!?
バ、バカな...!ハッカソンの中で成長しているだと...!?Kenji Tanaka
 
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJavaYuichi Sakuraba
 

En vedette (20)

Swift Type System
Swift Type SystemSwift Type System
Swift Type System
 
俺のManaged Objectの使い方は間違っていた
俺のManaged Objectの使い方は間違っていた俺のManaged Objectの使い方は間違っていた
俺のManaged Objectの使い方は間違っていた
 
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobileNS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
 
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswiftSwift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
 
Swift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdotsSwift らしい表現を目指そう #eventdots
Swift らしい表現を目指そう #eventdots
 
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
VC「もしかして...」Model「私たち...」「「入れ替わってるー!?」」を前前前世から防ぐ方法
 
RDRA DDD Agile
RDRA DDD AgileRDRA DDD Agile
RDRA DDD Agile
 
Blending Culture in Twitter Client
Blending Culture in Twitter ClientBlending Culture in Twitter Client
Blending Culture in Twitter Client
 
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
 
勉強会のこちら側とあちら側
勉強会のこちら側とあちら側勉強会のこちら側とあちら側
勉強会のこちら側とあちら側
 
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 3rd #minna_de_swift
 
#yidev 第25回勉強会 オープニング
#yidev 第25回勉強会 オープニング#yidev 第25回勉強会 オープニング
#yidev 第25回勉強会 オープニング
 
あなたのオブジェクト指向はオブジェクト指向ではないかもしれない
あなたのオブジェクト指向はオブジェクト指向ではないかもしれないあなたのオブジェクト指向はオブジェクト指向ではないかもしれない
あなたのオブジェクト指向はオブジェクト指向ではないかもしれない
 
JVM言語を使ってみようの歌
JVM言語を使ってみようの歌JVM言語を使ってみようの歌
JVM言語を使ってみようの歌
 
Java in the Past, Java in the Future
Java in the Past, Java in the FutureJava in the Past, Java in the Future
Java in the Past, Java in the Future
 
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swiftみんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift
みんなで Swift 復習会での談笑用スライド – in 札幌 1st′ #minna_de_swift
 
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 5th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 5th #minna_de_swift
 
バ、バカな...!ハッカソンの中で成長しているだと...!?
バ、バカな...!ハッカソンの中で成長しているだと...!?バ、バカな...!ハッカソンの中で成長しているだと...!?
バ、バカな...!ハッカソンの中で成長しているだと...!?
 
Swift + GraphQL
Swift + GraphQLSwift + GraphQL
Swift + GraphQL
 
これまでのJava これからのJava
これまでのJava これからのJavaこれまでのJava これからのJava
これまでのJava これからのJava
 

Plus de Tomohiro Kumagai

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_growTomohiro Kumagai
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせTomohiro Kumagai
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swiftTomohiro Kumagai
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominTomohiro Kumagai
 
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料Tomohiro Kumagai
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′Tomohiro Kumagai
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftTomohiro Kumagai
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラTomohiro Kumagai
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapTomohiro Kumagai
 
iOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftiOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftTomohiro Kumagai
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swiftTomohiro Kumagai
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販NightTomohiro Kumagai
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′Tomohiro Kumagai
 
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftmacOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftTomohiro Kumagai
 
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftみんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftTomohiro Kumagai
 
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconGetting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconTomohiro Kumagai
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′Tomohiro Kumagai
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′Tomohiro Kumagai
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017Tomohiro Kumagai
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料Tomohiro Kumagai
 

Plus de Tomohiro Kumagai (20)

最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
最近気づいた勉強法 — 勉強会開催の習慣化 #yumemi_grow
 
Swift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせSwift 所有権 要諦 #ゆるちとせ
Swift 所有権 要諦 #ゆるちとせ
 
_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift_Function Builders in Swift #love_swift
_Function Builders in Swift #love_swift
 
Property Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoominProperty Wrappers の特徴を眺める #swiftzoomin
Property Wrappers の特徴を眺める #swiftzoomin
 
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
みんなで Swift 復習会 GO! in "Swift Days Fukuoka" – 12nd′ オープニング&資料
 
みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′みんなで Swift 復習会
GO! in 札幌 – 10th′′
みんなで Swift 復習会
GO! in 札幌 – 10th′′
 
イニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswiftイニシャライザー Part 2.5 #hakataswift
イニシャライザー Part 2.5 #hakataswift
 
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
ニコニコ超会議・文化の交差点 #techpub #ニコニコ超会議 #さくらシンデレラ
 
Swift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsapSwift クラスのイニシャライザー #devsap
Swift クラスのイニシャライザー #devsap
 
iOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swiftiOSCon 2019 in London #ioscon #love_swift
iOSCon 2019 in London #ioscon #love_swift
 
Around the 変数 let #love_swift
Around the 変数 let #love_swiftAround the 変数 let #love_swift
Around the 変数 let #love_swift
 
もくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Nightもくもく執筆会 #技術同人誌再販Night
もくもく執筆会 #技術同人誌再販Night
 
みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′みんなで Swift 復習会 GO! in 岩手 – 9th′
みんなで Swift 復習会 GO! in 岩手 – 9th′
 
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswiftmacOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
macOS アプリで Swift Package Manager を使ってみる #love_swift #hakataswift
 
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swiftみんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
みんなで Swift 復習会 GO! in 福岡 – 8th′ #minna_de_swift
 
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #iosconGetting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
Getting Started with Attending iOSCon in London 高画質・追記版 #love_swift #ioscon
 
みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′みんなで Swift 復習会
GO! in 京都 – 6th′
みんなで Swift 復習会
GO! in 京都 – 6th′
 
みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′みんなで Swift 復習会 GO! in 福岡 – 5th′
みんなで Swift 復習会 GO! in 福岡 – 5th′
 
勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017勉強会の東京外開催の気持ち #yuru_bounen2017
勉強会の東京外開催の気持ち #yuru_bounen2017
 
みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料みんなで Swift 復習会 GO! in 福岡・発表資料
みんなで Swift 復習会 GO! in 福岡・発表資料
 

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

  • 1.
  • 2.
  • 4.
  • 5.
  • 6.
  • 8.
  • 9.
  • 10. NSInteger integerValue = 10; double doubleValue = 128.9; // 明示キャスト NSUInteger value1 = (NSUInteger)integerValue; NSInteger value2 = (NSInteger)doubleValue; char value3 = (char)integerValue; double value4 = (double)integerValue;
  • 11. NSInteger integerValue = 10; double doubleValue = 128.9; // 暗黙キャスト NSUInteger value1 = integerValue; NSInteger value2 = doubleValue; char value3 = integerValue; double value4 = integerValue;
  • 12. NSInteger integerValue = -8000000000000002345; double doubleValue = 123456789.935; // 誤差が出るキャスト NSInteger value1 = doubleValue; // 123456789 double value2 = integerValue; // -8000000000000002048 NSUInteger value3 = integerValue; // 10446744073709549271u short value4 = doubleValue; // -13035
  • 13. doubleValue + floatValue // double floatValue + doubleValue // double doubleValue + longDoubleValue // long double intValue + floatValue // float intValue + charValue // int intValue + longValue // long charValue + shortValue // int
  • 14. 1 / 3.0 // 0.3333333333333333 1 / 3.0f // 0.33333333f 1 / 3 // 0 1 / 3.0 == 1 / 3 // false 1 / 3.0 == 1 / 3.0f // false
  • 15. int a = 1, b = 3, c = 5, d = 4; // 明示キャストによる制御 c * (a / b * d) // 0 c * (a / (double)b * d) // 6.666666666666666 c * (int)(a / (double)b * d) // 5 (int)(c * ((double)a / b * d)) // 6 c * (double)(a / b) * d // 0
  • 16. short shortValue = 0x7FFF; long longValue = 0x12345678; // 再解釈キャスト short value1 = *(short*)&longValue; // 0x5678 long value2 = *(long*)&shortValue; // 0x6080000000207FFF double value3 = *(double*)&longValue; // 1.508974781700064e-315
  • 17. NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = (NSObject*)data; // ダウンキャスト NSMutableData *obj2 = (NSMutableData*)data;
  • 18. NSData *data = [[NSMutableData alloc] init]; // アップキャスト NSObject *obj1 = data; // ダウンキャストは明記が必要 NSMutableData *obj2 = (NSMutableData*)data;
  • 19. NSString *obj = [[NSString alloc] init]; // 無関係な型へのキャスト NSNumber *number = (NSNumber*)obj; // メソッドが存在しなければ実行時エラー NSString *text = [number descriptionWithLocale: nil];
  • 20. id object; // 可能性の判定 if ([object isKindOfClass:[NSNumber class]]) { // 整合性が約束されればキャストを実施 NSNumber *number = (NSNumber*)object; }
  • 21.
  • 22.
  • 23.
  • 24.
  • 25. 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. let sourceValue: UInt = 18446744073709551615 // 変換できないとき let value1 = Int(sourceValue) let value2 = Int("120x") // nil
 let value3 = try MyValue(sourceValue) // Error
  • 27. let source: UInt = 18446744073709551000 // 型を変換 let value1 = Int(bitPattern: source) // -616 let value2 = Int8(truncatingBitPattern:source) // -104
  • 28. let source: Int64 = 0x12345678 // 再解釈 var value1 = unsafeBitCast(source, Double.self) // 1.508974781700064e-315 var value2 = unsafeBitCast(source, Int32.self)
  • 29. as as? as! let instance: NSData = NSMutableData() // アップキャスト let object1 = instance as NSObject // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData
  • 30. let instance: NSData = NSMutableData() // アップキャスト let object1: NSObject = instance // ダウンキャスト let object2 = instance as? NSMutableData let object2 = instance as! NSMutableData
  • 31. let object = NSString() // 無関係な型へのキャスト let number1 = object as? NSData // nil let number2 = object as! NSData // ERROR
  • 32.
  • 33.
  • 34.
  • 36. (int)value Int(value) [instance toDouble] Double(instance) (SubClass*)object (BaseClass*)object object as? SubClass object as BaseClass 
 [object isKindOfClass:
 [SomeClass class]] if let obj = object
 as? SomeClass { 
 *(double*)&value unsafeBitCast( value, Double.self)
  • 37.
  • 38.
  • 39.
  • 40. @interface ESMyObject : NSObject // NSInteger 型から自分の型に変換する - (instancetype)initWithInteger:(NSInteger)value; @end
  • 41. @interface ESMyObject : NSObject // 自分自身から NSInteger に変換 - (NSInteger)toInteger; @end
  • 42. // NSInteger から自分自身に変換 ESMyObject *object = [[ESMyObject alloc] initWithInteger: 10]; // 自分自身を NSInteger に変換 NSInteger value = [object toInteger];
  • 43. @interface ESMyObject : NSObject // NSLocale からの変換? - (instancetype)initWithLocale:(NSLocale)locale; // 自分自身から NSPoint への変換? - (NSPoint)toPoint; @end
  • 44.
  • 45.
  • 46. struct MyValue { // Int 型から自身の型へ変換するイニシャライザ init(_ value: Int) { } }
  • 47. extension Int { // MyValue 型から自身の型 (Int) へ変換する init(_ value: MyValue) { } }
  • 48. // Int から自分自身に変換 let value = MyValue(100) // 自分自身を Int に変換 let number = Int(value)
  • 49. struct MyValue { // ラベル名を伴う場合は Full-Width 変換ではない init(locale: NSLocale) {…} // これがもし Full-Width 変換なら
 // NSPoint に変換イニシャライザとして実装したい func toPoint() -> NSPoint {…} }
  • 50.
  • 51. 
 
 
 
 
 

  • 52. 
 
 
 
 
 init / init?
 init … throws
  • 53.
  • 54.
  • 55. // 一般に Optional Binding とセットで使う if let number = instance as? NSData { } else { // キャストできなかった場合も想定できる }
  • 56. // 確実にダウンキャスト出来る時にだけ使う let data = instance as! NSData // キャストできない場合は強制終了 let data = instance as! NSNumber
  • 57. // 確実にダウンキャスト出来るかを判定 if instance is NSData { // ここならキャストが確実にできる let data = instance as! NSData } 

  • 58.
  • 59. let workData = NSMutableData() // 継承関係より NSData で扱えるのは明らか let data = workData as NSData
  • 60. // 中身的には NSMutableData 型でも、 let instance: AnyObject = NSMutableData() // 外見からは NSData にキャスト出来るか分からない
 // こういうときは as? または as! でのキャストが必要 let data = instance as? NSData 

  • 61. let string = String() // ブリッジ機構は Swift 標準ライブラリが提供 let objcString = string as NSString
  • 62.
  • 63.
  • 64. (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