EZ-‐‑‒NET 熊⾕谷友宏 http://ez-‐‑‒net.jp/
2015.03.07 @ yidev 第18回勉強会
Swift カジュアルプログラミング
《余談》構造体の時代
熊谷友宏http://ez-net.jp/ @es_kumagai
Xcode 5 徹底解説
IP Phone 音でダイヤル 音で再配達ゴッド
いつもの電卓 for iPhone
いつもの電卓 for iPad
音で再配達
これまで
Primitive
クラス
構造体
Objective-C
これから
型
クラス
構造体
Swift
これまでの定義Objective-C
// 構造体の定義 typedef struct {
int v;
} MyStruct;
// クラスの定義 @interface MyClass : NSObject
@property (readwrite) int v;
@end
これからの定義Swift
// 構造体の定義 struct MyStruct {
var v:Int32 }
// クラスの定義 class MyClass {
var v:Int32 }
これまで&これから
MyStruct s = { 0 }; MyClass* c = [[MyClass alloc] init];
let s = MyStruct() let c = MyClass()
これまでの使い方
これからの使い方Swift
Objective-C
これまで&これから
SwiftObjective-C
▶ 構造体は脇役 ▶ 構造体が主役
構造体
これまで
▶ 複合データ型
これから
▶ 値や状態を表現する型
値とは、定まるもの▶ 評価したい式で使うもの ▶ 何かの式を評価したもの
たとえば
a = f(x,y,z)
▶ 時間軸で変化する値 ▶ 今の “有り様” を表現するもの
状態とは、変化するもの
たとえば
location: (x,y) capacity: ㎖
それぞれ別の変数で表現
▶ 不変値変数 let値
▶ 可変値変数 var状態
値と状態
これから
// 平面を動く物体の座標 var location:(x,y)
// 平面座標の値 let location:(x,y)
変数自体が意味を持つ時代
構造体の性質が格納先で変化
▶ Immutable 扱い
可変値変数 var
▶ Mutable 扱い
不変値変数 let
これから
let s = MyStruct() s.value = 10
var s = MyStruct() s.value = 10
値や状態で使う型は
これから
原則、構造体で定義
▶ String ▶ Array ▶ Int
クラス
これまで
▶ オブジェクト型
これから
▶ 状態を制御する型
▶ 制御対象の状態を持つ ▶ 状態を制御する機能の集合体
状態を制御
クラス
var s = MyClass() s.value = 10
let s = MyClass() s.value = 10
状態は更新可能
コンセプトの違い
構造体
▶ 値や状態を表現する型
クラス
▶ 状態を制御する型
コンセプトによる違い
構造体let s = MyStruct()
クラスlet c = MyClass()
値
状態
実体 制御
同じ書き方で違う仕上がり
(var なら状態)
コンセプトによる違い
構造体let s = MyStruct()
クラスlet c = MyClass()
値
状態
実体 制御
let で保護されるところ
値の全体 実体のみ
おさらい
▶ 不変値変数 let値
▶ 可変値変数 var状態
値と状態
値 状態
変化するもの固定のもの
コピー
連動を断ち切る
let value = 0 var state = value
状態
変化するもの
連動を断ち切る
ここで断ち切る
コピー
クラスのコピーは実体だけ
実体 実体制御する状態は共有
let instance1 = 0 let instance2 = instance1
状態
実体を複製、状態は共有
コピーの指示
これまで
これから
// 明示コピー NSString* str2 = [str1 copy];
// 原則コピー let str2 = str1
Swift
Objective-C
コピーの指示
これまで
これから
// 明示コピー NSString* str2 = [str1 copy];
// 原則コピー let str2 = str1
Swift
Objective-Cここでコピー!と言っている
ここでコピー!とは言ってない
タイミングを言語に委ねられる原則コピーで
構造体の基本原則▶ 内容はコピー別の変数へ代入時は内容をコピー
▶ 原則コピー原則に従えばタイミングは問わない
Array の最適化▶ 内容はコピー別の変数へ代入時は内容をコピー
▶ 原則コピーただし必要な時までコピーされない
配列コピーのタイミング
配列
Buffer
コピー配列
バッファーは共有
配列
Buffer
配列
配列コピーのタイミング
配列
Buffer Buffer
×
遅延コピー
書き込み!
原則に沿って遅延コピーArray は最適化設計
マルチスレッドでの挙動は…?Thread 1 Thread 2
Buffer
配列配列
コピーして渡したつもり
書き込み!
Buffer
遅延コピー
×
明示コピーの方法は?
▶ unshare()今は使えない
Swift Beta 2 時代
▶ map { $0 }スマートではない
Swift 1.2 で実現するとしたら…?
おしまい
これまでとこれから▶ これからは構造体が主役 ▶ 値と状態を扱うオブジェクト
原則▶ 内容は原則コピー ▶ 原則コピーで最適化を図る
マルチスレッド周りは?▶ 未確認 !