48
EZNET 熊友宏 http://eznet.jp/ 2015.03.07 @ yidev 第18回勉強会 Swift カジュアルプログラミング 《余談》構造体の時代

Swift 構造体の時代 #yidev

Embed Size (px)

Citation preview

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

音で再配達

構造体元年2014 Swift

これまで & これから

これまで

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 で実現するとしたら…?

おしまい

これまでとこれから▶ これからは構造体が主役 ▶ 値と状態を扱うオブジェクト

原則▶ 内容は原則コピー ▶ 原則コピーで最適化を図る

マルチスレッド周りは?▶ 未確認 !