Successfully reported this slideshow.
Your SlideShare is downloading. ×

SwiftにおけるClassとStructの使い分け

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 18 Ad

More Related Content

Recently uploaded (20)

Advertisement

SwiftにおけるClassとStructの使い分け

  1. 1. Swiftにおける ClassとStructの使い分け 2015/12/15 shibuya.swift #2
  2. 2. Kazunobu Tasaka 自己紹介 @tasanobu
  3. 3. 本日の内容 • Class と Struct の違い • Class と Struct の使い分け 備考: 適宜、Class を Reference Types , Struct をValue Types
 と読み替えてお聴き頂けると幸いです。
  4. 4. Class と Struct の違い
  5. 5. = の挙動 • Struct • インスタンスが複製される • Class • インスタンスへの参照ができる • インスタンスは複製されない
  6. 6. Struct • p1, p2 は独立した別々のインスタンス • p2.x への変更は p1.x の値に反映されない struct Point { var x: Float = 0.0 var y: Float = 0.0 } let p1 = Point() var p2 = p1 // Point instance is copied! p2.x = 5.0 p1.x // x: 0.0, y: 0.0 p2.x // x: 5.0, y: 0.0
  7. 7. Class • p1, p2 は同じインスタンスへの参照 • 結果、p2.x への変更が p1.x の値にも反映される class Point { var x: Float = 0.0 var y: Float = 0.0 } let p1 = Point() let p2 = p1 // Point instance is NOT copied! p2.x = 5.0 p1.x // x: 5.0, y: 0.0 p2.x // x: 5.0, y: 0.0
  8. 8. Mutability • let で宣言された定数の挙動が Class と Struct で異なる
  9. 9. Class • 参照が定数として扱われる(変更不可) class Point { var x: Float = 0.0 var y: Float = 0.0 } let p = Point() p = Point() // ERROR Cannot assign to value: 'p' is a 'let' constant p.x = 5.0 • インスタンスの値は変更可能
  10. 10. Struct • インスタンス自体 が定数として扱われる • プロパティの値も変更不可(let, var は無関係) struct Point { var x: Float = 0.0 var y: Float = 0.0 } let p = Point() p = Point() // ERROR Cannot assign to value: 'p' is a 'let' constant p.x = 10.0 // ERROR Cannot assign to property: 'p' is a 'let' constant
  11. 11. Struct の特徴 • インスタンスの独立性が担保されやすい(= の挙動) • let 定数化によりインスタンスをimmutableにできる
 👇 Struct の方がmutabilityを管理しやすい
 
 Classで同様のことを実現するためには
 NSString, NSMutableString のような関係のクラスを実装する必要あり。
  12. 12. Class と Struct の使い分け
  13. 13. 方針 通常、型は mutability をシンプルに管理したい
 👉 Structで要件を満たせないか検討する
  14. 14. Class に向くケース • Cocoaのクラスを使う場合 • XXXViewController, YYYTableViewCell, etc. • インスタンスをMutableにして共有したい場合 class Account { var balance = 0.0 } class Person { let account: Account init(_ account: Account) { self.account = account } } let account = Account() let husband = Person(account) let wife = Person(account) husband.account.balance += 1000 wife.account.balance -= 1000 // 😭 😭 😭 😭 😭 😭
  15. 15. 悩ましいケース • Struct が Class のプロパティを持つ場合 👉 let で定数化しても Class のプロパティが変更可 👉 Struct のimmutabilityが壊れる💦 struct Share { var view: UIView } let s = Share(view: UIView()) s.view.backgroundColor = UIColor.redColor()
  16. 16. まとめ Struct • Mutabilityの管理に優れている • 型に対する要件を Struct で満たせないかを検討する Class • Mutabilityの管理しやすさは劣るが使い所はある • CoCoaのクラスを使う場合 • インスタンスをMutableにして共有したい場合 Struct which contains Classes • 適した使い所を見極め中。。。
  17. 17. References Value and Reference Types https://developer.apple.com/swift/blog/?id=10 When to Use Swift Structs and Classes by Mike Ash https://www.mikeash.com/pyblog/friday-qa-2015-07-17-when-to-use-swift-structs-and- classes.html Reference vs Value Types in Swift: Part 1/2 http://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1 Github Swift Style Guide https://github.com/github/swift-style-guide
  18. 18. ご静聴ありがとうございました 🙇

×