SlideShare a Scribd company logo
EZ-NET 熊⾕友宏
http://ez-net.jp/
2016.02.06
カジュアル Swift 勉強会 @ ⻘葉台
模索するための事前知識
可変値変数 var を極⼒避けることを
Swift 2.1.1
熊谷友宏
Xcode 5 徹底解説 MOSA
Xcode 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 Phone
iPhone でひかり電話を使う。
自宅 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 + 1
1 + 5
6 + 10
16 + -3
13 + 8
array.reduce(0)
{ $0 + $1 }
まとめ
▶ 予測不能な変化を防げる
▶ 変化を考慮した制御が不要になる
得られる利点
可変値変数を極力避ける
▶ スコープの中では認知されている考え方
▶ スコープを超えたクラス規模でも効果的?
可能性を確かめてみたい!
to be continued ...
模索するための事前知識
可変値変数 var を極力避けることを
1. 2種類の変数
不変値変数 let … 値を表現
可変値変数 var … 状態を表現
2. 原則、不変値変数を使う
予測不能な変化を阻止
変化を考慮した制御が不要
3. 値を意識した言語仕様
構造体
扱いで振る舞いが変わる … mutating
代入時コピー

More Related Content

PDF
NSNotification in Swift #cocoa_kansai
PDF
Swift の可変値と不変値 #cocoa_kansai
PDF
Swift 構造体の時代 #yidev
PDF
Swift ドキュメントコメント
PDF
Swift を振り返ってみよう #cswift
PDF
プロトコル拡張の話? #WWDC21cafe
PDF
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
PDF
Swift 3 その基本ルールを眺める #cswift
NSNotification in Swift #cocoa_kansai
Swift の可変値と不変値 #cocoa_kansai
Swift 構造体の時代 #yidev
Swift ドキュメントコメント
Swift を振り返ってみよう #cswift
プロトコル拡張の話? #WWDC21cafe
第7回 カジュアル Swift 勉強会 @ 青葉台 オープニング #cswift
Swift 3 その基本ルールを眺める #cswift

What's hot (20)

PDF
リテラルと型の続きの話 #__swift__
PDF
プロトコル指向に想う世界観 #__swift__
PDF
リテラルと型の話 #__swift__
PDF
lazy var の特徴を知る #cocoa_kansai #cswift
PDF
Swift 2.0 で変わったところ「後編」 #cswift
PDF
Xcode 7 の新しいところ #cm_ios9
PDF
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
PDF
Study Swift
PDF
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
PDF
iOS 8/Swift 概要 #ios8yahoo
PDF
Xcode 6の新機能
PDF
Swift 2.0 大域関数の行方から #swift2symposium
PDF
Swift勉強会
PDF
Swift 2.0 で変わったところ「前編」 #cswift
PDF
Swift 2 (& lldb) シンポジウム
PDF
OSC2011Tokyo/Fall OpenStack Swift入門
PDF
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
PDF
ジェネリック関数の呼び出され方 #cocoa_kansai
PPTX
Swiftからlibuvを呼び出すTIPS
PDF
Swiftのswitchはとってもパワフル!
リテラルと型の続きの話 #__swift__
プロトコル指向に想う世界観 #__swift__
リテラルと型の話 #__swift__
lazy var の特徴を知る #cocoa_kansai #cswift
Swift 2.0 で変わったところ「後編」 #cswift
Xcode 7 の新しいところ #cm_ios9
Swift : クラス継承とプロトコル拡張を比べてみる #yidev
Study Swift
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
iOS 8/Swift 概要 #ios8yahoo
Xcode 6の新機能
Swift 2.0 大域関数の行方から #swift2symposium
Swift勉強会
Swift 2.0 で変わったところ「前編」 #cswift
Swift 2 (& lldb) シンポジウム
OSC2011Tokyo/Fall OpenStack Swift入門
もしiOS8のカスタムキーボードがガジェットのSDKを搭載したら Ver.#ios8yahoo
ジェネリック関数の呼び出され方 #cocoa_kansai
Swiftからlibuvを呼び出すTIPS
Swiftのswitchはとってもパワフル!
Ad

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

PDF
Apple Map
PPTX
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
PDF
DoActionからJava VMバイトコードに変換する話
PPTX
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
PDF
Play jjug2012spring
PPTX
ななめ45°から見たJavaOne
PDF
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
PPTX
Build Node.js-WASM/WASI Tiny compiler with Node.js
PDF
Swift事情2014夏 ~ Swift入門 beta6対応
PDF
asm.js x emscripten: The foundation of the next level Web games
PDF
Wolcome to swift
PDF
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
PDF
これからはじめる SwiftPlayground入門
PDF
第11回 cocos2d-x勉強会 「cocos2dxでLWFを利用する」
PPT
鈴木:Net commonsでの中国語使用について
PPT
鈴木:Net commonsでの中国語使用について
PDF
OpenStackで始めるクラウド環境構築入門
PPTX
Scalatronで楽しく学ぶ関数型プログラミング
PPTX
もしも… Javaでヘテロジニアスコアが使えたら…
PDF
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Apple Map
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
DoActionからJava VMバイトコードに変換する話
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Play jjug2012spring
ななめ45°から見たJavaOne
ソフトウェアエンジニアリングの全体とIoT時代のモデリングおよび関連する品質
Build Node.js-WASM/WASI Tiny compiler with Node.js
Swift事情2014夏 ~ Swift入門 beta6対応
asm.js x emscripten: The foundation of the next level Web games
Wolcome to swift
RFC Viewer開発を通して学ぶ!! iOS開発のパターン化
これからはじめる SwiftPlayground入門
第11回 cocos2d-x勉強会 「cocos2dxでLWFを利用する」
鈴木:Net commonsでの中国語使用について
鈴木:Net commonsでの中国語使用について
OpenStackで始めるクラウド環境構築入門
Scalatronで楽しく学ぶ関数型プログラミング
もしも… Javaでヘテロジニアスコアが使えたら…
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
Ad

More from Tomohiro Kumagai (20)

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

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