SlideShare a Scribd company logo
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

PPTX
Effective java 輪読会 第2章 項目5,6,7
PDF
Objc05
PPT
クラスのインスタンス変数について
PDF
Swift3.0に向けて enumerateを使い始めよう
PDF
プログラミング初心者の壁の越え方
PDF
Swift API Design Guidelines (dec 3, 2015)
PDF
Applicative Functors in Swift
PDF
class vs struct
Effective java 輪読会 第2章 項目5,6,7
Objc05
クラスのインスタンス変数について
Swift3.0に向けて enumerateを使い始めよう
プログラミング初心者の壁の越え方
Swift API Design Guidelines (dec 3, 2015)
Applicative Functors in Swift
class vs struct

Viewers also liked (12)

PDF
8 swift 중첩함수
PDF
Class vs struct for Swift
PDF
lazy var の特徴を知る #cocoa_kansai #cswift
PDF
Struct vs Class in Swift
PDF
Swift 3 Programming for iOS : class and structure
PDF
Swift 3 Programming for iOS: Function
PDF
Swift Tutorial Part 1. The Complete Guide For Swift Programming Language
PPTX
【Swift】 それ、enumとstructでやってみましょう!!
PDF
iOS for Android Developers (with Swift)
PDF
Learning.... Swift functions!
PDF
Swift Introduction
PDF
Swift Programming Language
8 swift 중첩함수
Class vs struct for Swift
lazy var の特徴を知る #cocoa_kansai #cswift
Struct vs Class in Swift
Swift 3 Programming for iOS : class and structure
Swift 3 Programming for iOS: Function
Swift Tutorial Part 1. The Complete Guide For Swift Programming Language
【Swift】 それ、enumとstructでやってみましょう!!
iOS for Android Developers (with Swift)
Learning.... Swift functions!
Swift Introduction
Swift Programming Language
Ad

Similar to SwiftにおけるClassとStructの使い分け (20)

PPTX
Swiftにおけるclassとstructの使い分けをDDDから考える
PDF
Study Swift
PDF
楽しいSwift!クラスと構造体を知る:)
PDF
Swiftで、かなり微妙な型クラス
PDF
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
PDF
Swift 構造体の時代 #yidev
PDF
Swift らしい表現を目指そう #eventdots
PDF
Swiftのアプリ開発でハマったこと
PDF
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
PDF
Swift事情2014夏 ~ Swift入門 beta6対応
PDF
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
PDF
Swift入門おさらい
PDF
Swift 2.0 で変わったところ「後編」 #cswift
PDF
Wolcome to swift
PDF
20140822 Swift 勉強会 vol.3 - はぢめての Swift
PDF
Swiftの新機能 Optional
PPTX
Deep dive into oss written in swift
PPTX
Deep dive into oss written in swift
PDF
iPhone, iPad アプリ開発勉強会#3
Swiftにおけるclassとstructの使い分けをDDDから考える
Study Swift
楽しいSwift!クラスと構造体を知る:)
Swiftで、かなり微妙な型クラス
Swift の可変値と不変値 〜 前回の続き(おまけ)〜 #cocoa_kansai
Swift 構造体の時代 #yidev
Swift らしい表現を目指そう #eventdots
Swiftのアプリ開発でハマったこと
Swift 3 を書くときに知っておきたい API デザインガイドライン #love_swift #akibaswift
Swift事情2014夏 ~ Swift入門 beta6対応
NS Prefix - そこから見渡す Swift 3 の景色 #startup_mobile
Swift入門おさらい
Swift 2.0 で変わったところ「後編」 #cswift
Wolcome to swift
20140822 Swift 勉強会 vol.3 - はぢめての Swift
Swiftの新機能 Optional
Deep dive into oss written in swift
Deep dive into oss written in swift
iPhone, iPad アプリ開発勉強会#3
Ad

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