19 get/set,willSet/didSet
dotinstall.com
get/set
- プロパティを動的に計算
- プロパティの値を取得する時と設定する時に計算式が書ける
class Student {
var name: String
var number: Int
var attendance: Int = 0
var rate: Int {
get {
return Int(Float(attendance) / 10.0 * 100)
}
set {
attendance = Int(newValue / 10)
}
}
init(name: String, number: Int) {
self.name = name
self.number = number
}
func attended() {
attendance++
}
}
var mayama = Student(name: "rika", number: 3)
mayama.attendance
mayama.rate
mayama.attendance = 1
mayama.rate
mayama.attendance = 3
mayama.rate
mayama.rate = 100
mayama.attendance
mayama.rate = 80
mayama.attendance
class Student {
var name: String
var number: Int
var attendance: Int = 0
var rate: Int {
return Int(Float(attendance) / 10.0 * 100)
}
init(name: String, number: Int) {
self.name = name
self.number = number
}
func attended() {
attendance++
}
}
willSet/didSet
- プロパティの状態監視
- 値が変わった時、変わる前と変わった後で何らかの処理を入れることができる
- プロパティが最初に初期化されるときには実行されない
class Student {
var name: String
var number: Int
var attendance: Int = 0 {
willSet {
println("willSet: \(attendance) -> \(newValue)")
}
didSet {
println("didSet: \(oldValue) -> \(attendance)")
}
}
var rate: Int {
return Int(Float(attendance) / 10.0 * 100)
}
init(name: String, number: Int) {
self.name = name
self.number = number
}
func attended() {
attendance++
}
}
var mayama = Student(name: "rika", number: 3)
mayama.attendance = 9
mayama.attendance = 10
20 Optionl Chaining
dotinstall.com
- クラスなどが複雑に入り組んでいた時に、プロパティやメソッドがあるか安全に確かめる方法
- 先頭から調べて行って、
nil
だった場合はそこで評価を止め、安全に終了させてnil
を返す
- 複雑になると、
?
マークがたくさんついていく
class User {
var blog: Blog?
}
class Blog {
var title = "My Blog"
}
var gawao = User()
gawao.blog?.title
if let t = gawao.blog?.title {
println(t)
}
21 Type Casting
dotinstall.com
- クラスの型をチェックしたり、あるクラスを親クラス・子クラスとして扱うための方法
- クラスの型チェックは
is
as
を使ってあるクラスを子クラスに変換することをダウンキャストする
という
- どのようなオブジェクトのインスタンスでもいいという特殊なデータ型がある
AnyObject
class User {
var name: String
init(name: String) {
self.name = name
}
}
class AdminUser: User {}
let kashiwagi = User(name: "hinata")
let matsuno = AdminUser(name: "rina")
let users: [User] = [kashiwagi, matsuno]
for user in users {
if user is AdminUser {
let u = user as AdminUser
println(u.name)
}
}
if let u = user as? AdminUser {
println(u.name)
}
class User {
var name: String
init(name: String) {
self.name = name
}
}
class AdminUser: User {}
class SomeUser {}
let kashiwagi = User(name: "hinata")
let matsuno = AdminUser(name: "rina")
let nakayama = SomeUser()
let users: [AnyObject] = [kashiwagi, matsuno, nakayama]