SlideShare a Scribd company logo
1 of 18
Download to read offline
Swiftにおける
ClassとStructの使い分け
2015/12/15
shibuya.swift #2
Kazunobu Tasaka
自己紹介
@tasanobu
本日の内容
• Class と Struct の違い
• Class と Struct の使い分け
備考:
適宜、Class を Reference Types , Struct をValue Types

と読み替えてお聴き頂けると幸いです。
Class と Struct の違い
= の挙動
• Struct
• インスタンスが複製される
• Class
• インスタンスへの参照ができる
• インスタンスは複製されない
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
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
Mutability
• let で宣言された定数の挙動が Class と Struct で異なる
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
• インスタンスの値は変更可能
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
Struct の特徴
• インスタンスの独立性が担保されやすい(= の挙動)
• let 定数化によりインスタンスをimmutableにできる

👇
Struct の方がmutabilityを管理しやすい



Classで同様のことを実現するためには

NSString, NSMutableString のような関係のクラスを実装する必要あり。
Class と Struct の使い分け
方針
通常、型は mutability をシンプルに管理したい

👉 Structで要件を満たせないか検討する
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 // 😭 😭 😭 😭 😭 😭
悩ましいケース
• Struct が Class のプロパティを持つ場合
👉 let で定数化しても Class のプロパティが変更可
👉 Struct のimmutabilityが壊れる💦
struct Share {
var view: UIView
}
let s = Share(view: UIView())
s.view.backgroundColor = UIColor.redColor()
まとめ
Struct
• Mutabilityの管理に優れている
• 型に対する要件を Struct で満たせないかを検討する
Class
• Mutabilityの管理しやすさは劣るが使い所はある
• CoCoaのクラスを使う場合
• インスタンスをMutableにして共有したい場合
Struct which contains Classes
• 適した使い所を見極め中。。。
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
ご静聴ありがとうございました
🙇

More Related Content

Viewers also liked

Viewers also liked (13)

8 swift 중첩함수
8 swift 중첩함수8 swift 중첩함수
8 swift 중첩함수
 
Class vs struct for Swift
Class vs struct for SwiftClass vs struct for Swift
Class vs struct for Swift
 
lazy var の特徴を知る #cocoa_kansai #cswift
lazy var の特徴を知る #cocoa_kansai #cswiftlazy var の特徴を知る #cocoa_kansai #cswift
lazy var の特徴を知る #cocoa_kansai #cswift
 
Struct vs Class in Swift
Struct vs Class in SwiftStruct vs Class in Swift
Struct vs Class in Swift
 
Swift 3 Programming for iOS : class and structure
Swift 3 Programming for iOS : class and structureSwift 3 Programming for iOS : class and structure
Swift 3 Programming for iOS : class and structure
 
Swift 3 Programming for iOS: Function
Swift 3 Programming for iOS: FunctionSwift 3 Programming for iOS: Function
Swift 3 Programming for iOS: Function
 
Swift Tutorial Part 1. The Complete Guide For Swift Programming Language
Swift Tutorial Part 1. The Complete Guide For Swift Programming LanguageSwift Tutorial Part 1. The Complete Guide For Swift Programming Language
Swift Tutorial Part 1. The Complete Guide For Swift Programming Language
 
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
 
iOS for Android Developers (with Swift)
iOS for Android Developers (with Swift)iOS for Android Developers (with Swift)
iOS for Android Developers (with Swift)
 
さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計さらに上を目指すための iOS アプリ設計
さらに上を目指すための iOS アプリ設計
 
Learning.... Swift functions!
Learning.... Swift functions!Learning.... Swift functions!
Learning.... Swift functions!
 
Swift Introduction
Swift IntroductionSwift Introduction
Swift Introduction
 
Swift Programming Language
Swift Programming LanguageSwift Programming Language
Swift Programming Language
 

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