Your SlideShare is downloading. ×
Swift の可変値と不変値 #cocoa_kansai
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Swift の可変値と不変値 #cocoa_kansai

134
views

Published on

Published in: Technology

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
134
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. EZ-NET 熊谷友宏 http://ez-net.jp/ 2015.02.28 @ 第60回 Cocoa 勉強会関西 Swift カジュアルプログラミング 《基礎》不変値と可変値
  • 2. 熊谷友宏 http://ez-net.jp/ @es_kumagai Xcode 5 徹底解説 IP Phone 音でダイヤル 音で再配達ゴッド いつもの電卓 for iPhone いつもの電卓 for iPad 音で再配達
  • 3. 熊谷友宏 http://ez-net.jp/ @es_kumagai #yidev 横浜 iPhone 開発者勉強会 開催中
  • 4. 不変値と可変値 Swift にある変数のお話
  • 5. Swift には 2つの変数 があります
  • 6. 不変値変数 // 値を書き込んだら… let value = 10 // 変更はできない value = 20 ▶ let で宣言された変数 ▶ 値を書き込めるのは1度だけ Swift
  • 7. 可変値変数 // 値を書き込んで… var value = 10 // さらに書き換えが可能 value = 20 ▶ var で宣言された変数 ▶ 何度でも書き換え可能 Swift
  • 8. 原則 可能な限り let を使う let prices = [100.0, 300.0, 200.0] let withTax = { $0 * 1.08 } let pricesWithTax = prices.map(withTax) let sum = pricesWithTax.reduce(0) {$0+$1} Swift ➡ Swift らしい安全なコードになる
  • 9. おしまい?
  • 10. 今回はもう少し先のお話
  • 11. 目標 ▶ 変数を値と状態で捉える ▶ 変数から Swift の全容を探る
  • 12. 目標 変数・構造体・クラスを知ると Swift はもっと楽しくなる
  • 13. 不変値と可変値 役割と性質
  • 14. 不変値
  • 15. 役割 ▶ 値を表現する 不変値
  • 16. 値とは ▶ 評価したい式で使うもの ▶ 何かの式を評価したもの 用途 ▶ 引数 ▶ 結果 不変値
  • 17. a = f(x,y,z) 不変値 ▶ 引数は使う前に決まる ▶ 結果は決まったら変わらない 評価式と値
  • 18. もし変わってしまったら? 不変値
  • 19. りんごは 130 円です じゃあ、3 つください _φ(・_・ 全部で 500 円です! え? りんごっていくらだっけ りんごは 250 円です あれ? そうだメモで確かめよう ほんとだ 250 円って書いてあった
  • 20. ??? ▶ りんご = 130 ▶ 値段メモ.りんご = りんご ▶ 購入数 = 3 ▶ print 金額(りんご,購入数) 500 ▶ print (りんご) 250 ▶ print (値段メモ.りんご) 250
  • 21. 不変値 変更の余地があると ▶ 変更を考慮したコードを記述
 渡し手と受け手で意思共有も必要 ▶ 取得値が勝手に変わる可能性
 コピーするかの判断が常に必要 煩わされる ▶ そもそも変える必要性がない
  • 22. 値の扱いに優れた変数 不変値変数 let の誕生
  • 23. 特徴 ▶ 設定したら書き変わらない ▶ 常にコピー 利点 ▶ 変化に備えた考慮が不要 ▶ コピーするかどうかで悩まない 不変値変数 let
  • 24. 使い方 不変値変数 let
  • 25. 三項演算子 ?: を使いましょう 不変値変数 let 条件で値を変えたい
  • 26. 三項演算子による値の設定 let discountRate = (isBargainDay ? 0.03 : 0.00) Swift
  • 27. クロージャーを活用しましょう 不変値変数 let 複雑な条件で値を変えたい
  • 28. クロージャーによる値の設定 let getPrice = { () -> Double? in if inStock { return applyRate(basePrice) } else { return nil } } let price = getPrice() Swift
  • 29. 従来通りの即時初期化をオススメ 不変値変数 let Swift 1.2 なら遅延初期化も可能
  • 30. 遅延初期化による値の設定 let price:Double? if inStock { price = applyRate(basePrice) } else { price = nil } Swift Swift 1.2 コードを読まないと値の設定場所が分からない…
  • 31. 即時初期化の利点 let basePrice = 150 let discountRate = (isBargainDay ? 0.03 : 0.00) let price = getPrice() Swift ▶ 傍を見れば設定値が分かる ▶ どんな場合も初期化できる、はず
  • 32. 可変値
  • 33. 役割 ▶ 状態を表現する 可変値
  • 34. 状態とは ▶ 時間軸で変化する値 ▶ 今の有り様を表現するもの 用途 ▶ プロパティ ▶ バッファー 可変値
  • 35. 可変値 ▶ 時事刻々と変化する ▶ 状況に応じて調整可能 移動する物の位置 location: (x,y) カップの容量 capacity: ㎖
  • 36. 可変値 変化する前提があると ▶ 変更を常に意識できる
 渡し手と受け手で意思が伝わる ▶ 再取得時には変わっている可能性
 コピーが必要 扱い方が定まる ▶ 扱いに悩む必要がなくなる
  • 37. 状態の扱いに優れた変数 可変値変数 var の登場
  • 38. 特徴 ▶ 設定後に書き換えられる ▶ 常にコピー 利点 ▶ 変化を前提とした扱いが可能 ▶ コピーするかどうかで悩まない 可変値変数 var
  • 39. 2種類の変数の誕生
  • 40. 2種類の変数 ▶ コーディングの方針が定まる ▶ ソースコードの可読性が向上 宣言 内容 用途 let 不変値 値 var 可変値 状態 変数には用途を込められる
  • 41. 2種類の変数が誕生したからには 言語によるサポートがある
  • 42. 変数の言語サポート ▶ 値と状態の相互運用 ▶ 変数に特化したオブジェクト
  • 43. 値と状態の相互運用 変数のコピー
  • 44. 変数はコピーされる ▶ 代入時に内容をコピー ▶ 他からの干渉を防ぐのが目的 コピー後の性質は代入先に依る ▶ 可変値に不変値を入れれば変更可 ▶ 元の性質には束縛されない
  • 45. 値と状態の相乗りを実現 変数のコピーで
  • 46. 相互乗り入れのイメージ
  • 47. この星は移動するよ! 今は (0, 0) に居るよ 今はどこに居るの? _φ(・_・ 横に20、縦に800、移動して! 移動したよ! 状態を可変値で宣言 今の状態を値にコピーして返却 状態の変更を不変値で指示 受け取った値を不変値にコピー 受け取った値をコピーして状態を更新
  • 48. 今は (20, 800) に居るよ 今はどこに居るの? _φ(・_・ 移動したよ! 前回より横に60移動したのね! 今は (80, 800) に居るよ 勝手に移動したよ! お、今はどこに居るの? _φ(・_・ 受け取った値を不変値にコピー 受け取った値を不変値にコピー 今の状態を値にコピーして返却 今の状態を値にコピーして返却 受け取った値と以前にコピーした値を比較 なんらかの値で状態を更新
  • 49. 変数に特化したオブジェクト 構造体
  • 50. おさらい
  • 51. Swift の変数は2種類 ▶ 決まれば変わらない値 ▶ 時事刻々と変化する状態 Objective-C は1種類の変数で工夫 ▶ Immutable クラス ▶ Mutable クラス
  • 52. Immutable クラス ▶ 初期化後の状態変化を禁止 ▶ 不変値に類似 Mutable クラス ▶ 初期化後の状態変化を制限しない ▶ 可変値に類似
  • 53. Objective-C では クラス設計によって変数を制御 プログラマーの自主性に依存
  • 54. Swift では 言語仕様が主導権を握る コンパイラによる変数の統制
  • 55. 変数の種類で制御 オブジェクトの性質が格納先で変化
  • 56. ▶ Immutable 扱い 可変値変数 ▶ Mutable 扱い 変数の種類で制御 不変値変数
  • 57. 変数の種類で振る舞いを変える 変数の種類で制御 構造体の登場
  • 58. ▶ 内容を自由に設計できる ▶ 内容は別変数へ代入時にコピー ▶ 格納先に応じて振る舞いを制御 目的 構造体 値や状態を表現するオブジェクト 特徴
  • 59. 値や状態で使うオブジェクトは 構造体 原則、構造体で定義 ▶ String ▶ Array ▶ Int
  • 60. 構造体 定義方法
  • 61. ▶ 内容は可変値変数のプロパティで定義 ▶ 構造体を可変値で扱う時のみ変更可 内容の定義 構造体 struct MyValue { var state:Int = 10 }
  • 62. ▶ mutating な機能のみ内容を変更可能 ▶ mutating な機能は可変値でのみ利用可 ▶ それ以外の機能は常に利用可能 機能の定義 構造体 struct MyValue { mutating func mutableMethod(v:Int) func immutableMethod(v:Int) }
  • 63. ▶ 内容は常に変更可能 ▶ デイニシャライザは存在しない イニシャライザの定義 構造体 struct MyValue { init() }
  • 64. ▶ 値や状態に特化したオブジェクト ▶ Immutable な振る舞いが基本 ▶ Mutable な機能は明示定義
 状態変化を伴う機能か見て分かる ▶ 使用中でも不変性を振替可能
 コピーするので元の値に干渉しない まとめ 構造体
  • 65. 構造体 オブジェクト設計における プログラマーへの負担が激減
  • 66. クラスは?
  • 67. ▶ 状態を制御する機能の集合体 ▶ 内部に状態を持つ 目的 クラス 状態を制御するオブジェクト 特徴
  • 68. UI の制御など クラス 制御機能の設計時に使用
  • 69. ▶ 制御する状態は共有 ▶ 代入時は実体がコピーされる
 状態はコピーされない ▶ 不変値変数は実体の不変性を保証
 状態の不変性は保証しない 状態は共有する クラス
  • 70. クラス 状態 実体 制御 実体 複製 制御
  • 71. ▶ 同じ状態の新しい実体を作成 状態もコピーしたい クラス ▶ Immutable クラスを自身で設計 状態の不変性を保証したい ▶ コンセプト的に無理(状態制御が目的) 不変値のときに Immutable にしたい 性質を踏まえた扱い方
  • 72. クラス そもそもクラス? ▶ 実体をコピーするときに
 状態もコピーする必要性が生じた ▶ 状態の不変性を保証が必要になった 構造体での実装も検討する そんなときは
  • 73. クラス 定義方法
  • 74. ▶ 状態は可変値変数のプロパティで定義 ▶ 実体を不変値で扱う時でも変更可 状態の定義 クラス class MyValue { var state:Int = 10 }
  • 75. ▶ 機能内から状態を変更可能 ▶ 変数の種類を問わず利用可能 機能の定義 クラス class MyValue { func method(v:Int) }
  • 76. ▶ 状態は常に変更可能 ▶ デイニシャライザでの後始末が可能 イニシャライザの定義 クラス class MyValue { init() deinit }
  • 77. ▶ 機能に特化したオブジェクト ▶ 状態を共有して制御する
 実体を複製して共通の状態を制御可能 ▶ 不変性が保証するのは実体だけ
 状態操作できないクラスは無価値 まとめ クラス
  • 78. 総括
  • 79. 総括 変数・構造体・クラスを知ると Swift はもっと楽しくなる
  • 80. 総括 2種類の変数 ▶ 不変値変数 let で値を扱う ▶ 可変値変数 var で状態を扱う 構造体 ▶ 値や状態に特化したオブジェクト ▶ 変数の種類で状態の不変性を制御 クラス ▶ 状態の制御に特化したオブジェクト