可変値変数 var を極力避けることを模索するための事前知識 #cswift
Post on 11-Feb-2017
1.505 Views
Preview:
TRANSCRIPT
EZ-NET 熊⾕友宏 http://ez-net.jp/
2016.02.06 カジュアル Swift 勉強会 @ ⻘葉台
模索するための事前知識可変値変数 var を極⼒避けることを
Swift 2.1.1
熊谷友宏
Xcode 5 徹底解説 MOSAXcode 5 の全機能を徹底的に解説した本
OSX/iOS 系の歴史深い有料会員制の勉強会
紙版は絶版、電子書籍は販売中
Xcode 7 でも役立つはず 法人会員も多数
@es_kumagai EZ-NET http://ez-net.jp/
書籍 / 登壇
熊谷友宏
横浜 iPhone 開発者勉強会#yidev
わいわい・ゆるく、iPhone 開発者のみんなで楽しく過ごすのが目的の会
【 横浜・馬車道 】カジュアル Swift 勉強会
#cswift
ゆるくみんなで Swift を語らえる場を作りたくて始めた会
【 横浜・青葉台 】
第22回を 2016-03-05 に開催
@es_kumagai EZ-NET http://ez-net.jp/
勉強会
熊谷友宏@es_kumagai EZ-NET http://ez-net.jp/
CodePiece
iOS, OS X, Apple Watch アプリ
ソースコードを Twitter と Gist に同時投稿できる。
いつもの電卓計算式も見える電卓アプリ。 watchOS 1 対応
音で再配達ゴッド簡単操作で 再配達の申し込み。
EZ-NET IP PhoneiPhone でひかり電話を使う。 自宅 LAN からの利用専用
CodePiece for OS X勉強会を楽しむアプリ
ソースコードを Twitter と Gist に同時投稿できる勉強会で知見をみんなと共有したい時とかに便利!
できること
#cswift
2種類の変数
1. 不変値変数
2. 可変値変数
2種類の変数概要
let value = 100
var value = 100
// 値を書き込んだら… let value = 10
// 変更はできない value = 20
▶ let で宣言された変数 ▶ 値を書き込めるのは1度だけ
不変値変数概要
// 値を書き込んで… var value = 10
// さらに書き換えが可能 value = 20
▶ var で宣言された変数 ▶ 何度でも書き換え可能
可変値変数概要
不変値変数の初期化は遅らせられる
▶ 使うまでに代入すれば良い ▶ 型の明記だけは必要 ▶ 条件で違う値を設定したり、クロージャーを再帰実行したいときに便利
// 型を明記して変数を定義する let value: Int
// 値の設定はその後で出来る(1度限り) value = 10 print(value)
【余談】不変値変数の初期化
原則不変値変数を使う
▶ 値が未来永劫、保証される ▶ 外からの予期しない変化を防ぐ
不変値変数を使う
▶ 変化を考慮したコードが不要になる
意図
▶ 値を変えてない変数を検出 ▶ let の使用を促してくる
不変値変数を使うコンパイラも推奨
不変値と可変値
1. 不変値変数
2. 可変値変数
不変値と可変値おさらい
let value = 100
var value = 100
1. 不変値変数
2. 可変値変数
不変値と可変値捉え方
値を表現
状態を表現
不変値変数
▶ 評価したい式で使うもの ▶ 何かを評価した結果
値を表現
a = f(x,y,z)
▶ 引数は使う前に決まる ▶ 結果は決まったら変わらない
変化する必要がない
可変値変数
▶ 時事刻々と変化する値 ▶ 今の様相を表現するもの
状態を表現
location: (x,y) amount: ㎖
変化する必要がある
不変値と可変値要所
着目点動くか動かないか
1. 不変値変数
2. 可変値変数
location: (x,y)
location: (x,y)
可読性変数が意味を含む
// 座標の値 let location:(x,y)
// 物体の現在位置 var location:(x,y)
不変値と可変値オプショナルにおける意味合い
1. 不変値変数
2. 可変値変数
不変値と可変値捉え方
値が得られるか否か
何もない状態が存在する
オプショナルな不変値変数
▶ 値が得られないかもしれない ▶ 取得後、速やかに判定する
値を得られるか否か
// 不必要にオプショナルのまま持ち越さない let index:Int? = values.indexOf("Apple")
// オプショナルは速やかに解消する if let index:Int = values.indexOf("Apple") { }
// アイテムを持ってない可能性がある struct Clipboard { var item:AnyObject? }
// 参照したら値、オプショナルは速やかに解消 if let item:AnyObject = clipboard.item { }
▶ 無い状態が継続する可能性がある ▶ ある瞬間を切り出すと値になる
オプショナルな可変値変数何もない状態が存在する
値を意識した言語仕様
▶ 新しい値型を作る ▶ 既存の値を組み合わせて表現する
構造体値を表現する型
// 座標を表現する構造体 struct Point {
var x:Int var y:Int
}
値型を支える仕組み (1)扱いで振る舞いが変わる
1. 不変値変数
2. 可変値変数
内容が書き込み禁止になる
内容が書き込み可能になる
1. 不変値変数
2. 可変値変数
構造体扱いで振る舞いが変わる
let location = Point(x:0, y:0)
location.x = 10
var location = Point(x:0, y:0)
location.x = 10
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) } } }
▶ 代入時に複製される ▶ 外部の影響を受けなくなる
代入時コピー
let location1 = Point(x:0, y:0)
// 別の変数に代入すると、新しい値が作られる let location2 = location1
値型を支える仕組み (2)
コピー
▶ 代入時に複製される ▶ 外部の影響を受けなくなる
代入時コピー
var currentLocation = Point(x:0, y:0)
// 状態も取得時に複製され、影響を受けなくなる let location = currentLocation
値型を支える仕組み (2)
コピー
値と状態の乗り入れが可能
不変値を意識すると起こる変化
値なのか、状態なのか
値なら可変値変数は使わない
Objective-C で普通な計算方法総和の計算
func sum(values: [Int]) -> Int {
var result = 0
for value in values { result += value }
return result }
▶ 足し合わせる数は、値 ▶ 足し合わせた結果は、値
値なら可変値変数は使わない
変数の用途を見直してみる総和の計算
可変値変数を使わないで計算すると…総和の計算
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()) } }
可変値変数を避けるのに便利な機能総和の計算
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 }
まとめ
▶ 予測不能な変化を防げる ▶ 変化を考慮した制御が不要になる
得られる利点可変値変数を極力避ける
▶ スコープの中では認知されている考え方 ▶ スコープを超えたクラス規模でも効果的?
可能性を確かめてみたい!
to be continued ...
模索するための事前知識可変値変数 var を極力避けることを
1. 2種類の変数 ✓ 不変値変数 let … 値を表現 ✓ 可変値変数 var … 状態を表現
2. 原則、不変値変数を使う ✓ 予測不能な変化を阻止 ✓ 変化を考慮した制御が不要
3. 値を意識した言語仕様 ✓ 構造体 ✓ 扱いで振る舞いが変わる … mutating ✓ 代入時コピー
top related