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. 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
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. 悩ましいケース
• Struct が Class のプロパティを持つ場合
👉 let で定数化しても Class のプロパティが変更可
👉 Struct のimmutabilityが壊れる💦
struct Share {
var view: UIView
}
let s = Share(view: UIView())
s.view.backgroundColor = UIColor.redColor()
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