42
EZ-NET 熊⾕友宏 http://ez-net.jp/ 2016.02.06 カジュアル Swift 勉強会 @ ⻘葉台 模索するための事前知識 可変値変数 var を極⼒避けることを Swift 2.1.1

可変値変数 var を極力避けることを模索するための事前知識 #cswift

Embed Size (px)

Citation preview

Page 1: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

EZ-NET 熊⾕友宏 http://ez-net.jp/

2016.02.06 カジュアル Swift 勉強会 @ ⻘葉台

模索するための事前知識可変値変数 var を極⼒避けることを

Swift 2.1.1

Page 2: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

熊谷友宏

Xcode 5 徹底解説 MOSAXcode 5 の全機能を徹底的に解説した本

OSX/iOS 系の歴史深い有料会員制の勉強会

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

Xcode 7 でも役立つはず 法人会員も多数

@es_kumagai EZ-NET http://ez-net.jp/

書籍 / 登壇

Page 3: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

熊谷友宏

横浜 iPhone 開発者勉強会#yidev

わいわい・ゆるく、iPhone 開発者のみんなで楽しく過ごすのが目的の会

【 横浜・馬車道 】カジュアル Swift 勉強会

#cswift

ゆるくみんなで Swift を語らえる場を作りたくて始めた会

【 横浜・青葉台 】

第22回を 2016-03-05 に開催

@es_kumagai EZ-NET http://ez-net.jp/

勉強会

Page 4: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

熊谷友宏@es_kumagai EZ-NET http://ez-net.jp/

CodePiece

iOS, OS X, Apple Watch アプリ

ソースコードを Twitter と Gist に同時投稿できる。

いつもの電卓計算式も見える電卓アプリ。 watchOS 1 対応

音で再配達ゴッド簡単操作で 再配達の申し込み。

EZ-NET IP PhoneiPhone でひかり電話を使う。 自宅 LAN からの利用専用

Page 5: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

CodePiece for OS X勉強会を楽しむアプリ

ソースコードを Twitter と Gist に同時投稿できる勉強会で知見をみんなと共有したい時とかに便利!

できること

#cswift

Page 6: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

2種類の変数

Page 7: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

1. 不変値変数

2. 可変値変数

2種類の変数概要

let value = 100

var value = 100

Page 8: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

// 値を書き込んだら… let value = 10

// 変更はできない value = 20

▶ let で宣言された変数 ▶ 値を書き込めるのは1度だけ

不変値変数概要

Page 9: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

// 値を書き込んで… var value = 10

// さらに書き換えが可能 value = 20

▶ var で宣言された変数 ▶ 何度でも書き換え可能

可変値変数概要

Page 10: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値変数の初期化は遅らせられる

▶ 使うまでに代入すれば良い ▶ 型の明記だけは必要 ▶ 条件で違う値を設定したり、クロージャーを再帰実行したいときに便利

// 型を明記して変数を定義する let value: Int

// 値の設定はその後で出来る(1度限り) value = 10 print(value)

【余談】不変値変数の初期化

Page 11: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

原則不変値変数を使う

Page 12: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 値が未来永劫、保証される ▶ 外からの予期しない変化を防ぐ

不変値変数を使う

▶ 変化を考慮したコードが不要になる

意図

Page 13: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 値を変えてない変数を検出 ▶ let の使用を促してくる

不変値変数を使うコンパイラも推奨

Page 14: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値と可変値

Page 15: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

1. 不変値変数

2. 可変値変数

不変値と可変値おさらい

let value = 100

var value = 100

Page 16: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

1. 不変値変数

2. 可変値変数

不変値と可変値捉え方

値を表現

状態を表現

Page 17: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値変数

▶ 評価したい式で使うもの ▶ 何かを評価した結果

値を表現

a = f(x,y,z)

▶ 引数は使う前に決まる ▶ 結果は決まったら変わらない

変化する必要がない

Page 18: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

可変値変数

▶ 時事刻々と変化する値 ▶ 今の様相を表現するもの

状態を表現

location: (x,y) amount: ㎖

変化する必要がある

Page 19: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値と可変値要所

Page 20: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

着目点動くか動かないか

1. 不変値変数

2. 可変値変数

location: (x,y)

location: (x,y)

Page 21: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

可読性変数が意味を含む

// 座標の値 let location:(x,y)

// 物体の現在位置 var location:(x,y)

Page 22: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値と可変値オプショナルにおける意味合い

Page 23: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

1. 不変値変数

2. 可変値変数

不変値と可変値捉え方

値が得られるか否か

何もない状態が存在する

Page 24: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

オプショナルな不変値変数

▶ 値が得られないかもしれない ▶ 取得後、速やかに判定する

値を得られるか否か

// 不必要にオプショナルのまま持ち越さない let index:Int? = values.indexOf("Apple")

// オプショナルは速やかに解消する if let index:Int = values.indexOf("Apple") { }

Page 25: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

// アイテムを持ってない可能性がある struct Clipboard { var item:AnyObject? }

// 参照したら値、オプショナルは速やかに解消 if let item:AnyObject = clipboard.item { }

▶ 無い状態が継続する可能性がある ▶ ある瞬間を切り出すと値になる

オプショナルな可変値変数何もない状態が存在する

Page 26: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

値を意識した言語仕様

Page 27: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 新しい値型を作る ▶ 既存の値を組み合わせて表現する

構造体値を表現する型

// 座標を表現する構造体 struct Point {

var x:Int var y:Int

}

Page 28: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

値型を支える仕組み (1)扱いで振る舞いが変わる

1. 不変値変数

2. 可変値変数

内容が書き込み禁止になる

内容が書き込み可能になる

Page 29: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

1. 不変値変数

2. 可変値変数

構造体扱いで振る舞いが変わる

let location = Point(x:0, y:0)

location.x = 10

var location = Point(x:0, y:0)

location.x = 10

Page 30: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

mutating可変値変数だけで使える機能struct MyValue {

// メソッドは、必要なら設計者が mutating を明示 mutating func increment {

self.value = value + 1 }

// 保持型プロパティは、セッターが mutating 扱い var value: Double

// 計算型プロパティは、既定ではセッターだけが mutating 扱い var integerValue: Int {

get { return Int(value) } set { self.value = Double(newValue) } } }

Page 31: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 代入時に複製される ▶ 外部の影響を受けなくなる

代入時コピー

let location1 = Point(x:0, y:0)

// 別の変数に代入すると、新しい値が作られる let location2 = location1

値型を支える仕組み (2)

コピー

Page 32: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 代入時に複製される ▶ 外部の影響を受けなくなる

代入時コピー

var currentLocation = Point(x:0, y:0)

// 状態も取得時に複製され、影響を受けなくなる let location = currentLocation

値型を支える仕組み (2)

コピー

値と状態の乗り入れが可能

Page 33: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

不変値を意識すると起こる変化

Page 34: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

値なのか、状態なのか

値なら可変値変数は使わない

Page 35: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

Objective-C で普通な計算方法総和の計算

func sum(values: [Int]) -> Int {

var result = 0

for value in values { result += value }

return result }

Page 36: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 足し合わせる数は、値 ▶ 足し合わせた結果は、値

値なら可変値変数は使わない

変数の用途を見直してみる総和の計算

Page 37: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

可変値変数を使わないで計算すると…総和の計算

func sum(values: [Int]) -> Int {

var result = 0

for value in values { result += value }

return result }

func sum(values: ArraySlice<Int>) -> Int { if values.isEmpty { return 0 } else { return values.first! + sum(values.dropFirst()) } }

Page 38: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

可変値変数を避けるのに便利な機能総和の計算

func sum(values: [Int]) -> Int {

return values.reduce(0) { $0 + $1 } }

1 5 10 -3 8

21

0

0 + 11 + 5

6 + 1016 + -3

13 + 8

array.reduce(0) { $0 + $1 }

Page 39: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

まとめ

Page 40: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

▶ 予測不能な変化を防げる ▶ 変化を考慮した制御が不要になる

得られる利点可変値変数を極力避ける

▶ スコープの中では認知されている考え方 ▶ スコープを超えたクラス規模でも効果的?

可能性を確かめてみたい!

Page 41: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

to be continued ...

Page 42: 可変値変数 var を極力避けることを模索するための事前知識 #cswift

模索するための事前知識可変値変数 var を極力避けることを

1. 2種類の変数 ✓ 不変値変数 let … 値を表現 ✓ 可変値変数 var … 状態を表現

2. 原則、不変値変数を使う ✓ 予測不能な変化を阻止 ✓ 変化を考慮した制御が不要

3. 値を意識した言語仕様 ✓ 構造体 ✓ 扱いで振る舞いが変わる … mutating ✓ 代入時コピー