個人用のポイントメモです。
閲覧した方でここは覚えてた方がいいよって教えてくれる親切な方がいたら是非コメントください。
プロパティ
2種類のプロパティがある
- 保持型プロパティ
- 計算型プロパティ
保持型プロパティ
- クラスに持たせる属性
- 定数プロパティだと初期値設定後変更できない。
class Person {
let name: String // 名前
var age: Int // 年齢
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
print(Person.init(name: "hoge", age: 12).name)
// 定数プロパティは初期値設定後変更できない
var p = Person(name: "fuga", age: 10)
p.age = 30
// p.name = "piyo"
- lazy(遅延評価)
- インスタンス生成時には生成されず、実際にアクセスしないと生成しない
- 定数プロパティにはlazy指定できない
- 使用ポイントは生成にコストがかかるインスタンスかつそれが使用されるかわからない場合にパフォーマンス向上が見込める
class Fuga {
lazy var fuga = Person(name: "piyo", age: 5)
}
var fuga = Fuga() // ここでは生成されない
print(fuga.fuga.name) // この行を書いたときに生成される
計算型プロパティ
- 値を保持せず他のプロパティの値から都度計算して結果を返したり設定するプロパティ
- 値の設定・返却にget,setを使う
プロパティ監視
- プロパティ値が設定される前と設定された後に処理ができる
- 設定される前に呼ばれるのはwillSet()
- 設定された後に呼ばれるのはdidSet()
- willSet()に引数を与えない場合はnewValueで値を参照できる
- didSet()に引数を与えない場合はoldValueで値を参照できる
class Person2 {
let name: String
var age: Int = 0 {
willSet {
print("\(self.age)から\(newValue)歳へ年齢を変更する")
}
didSet {
print("\(oldValue)歳から\(self.age)歳へ年齢を変更した")
}
}
// イニシャライザ
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let p2 = Person2(name: "hogehoge", age: 30)
print(p2.age)
p2.age = 20
print(p2.age) // willSet,didSetが呼ばれている
- willSet(),didSet()はイニシャライザ内からの変更時には呼ばれない
- プロパティ監視ではlazyは使えない
- プロパティ監視では計算型プロパティにも使用できない
- 配列やディクショナリ型のプロパティに対しては代入だけでなく追加削除でも呼ばれる
クラス・構造体・列挙型にもプロパティを持たせられる
- クラスは計算型プロパティのみ持てる
- 構造体と列挙型は保持型・計算型プロパティ両方持てる
- イニシャライザがないので保持型プロパティには宣言時に初期値が必要
- statciをつけて宣言する
/* ログイン情報 */
struct LoginInfo {
static var url = "https://login.com/"
static var port: Int {
if self.url.hasPrefix("https") {
return 443
} else {
return 80
}
}
var userId: String = "001"
}
print(LoginInfo.url)
print(LoginInfo.port)
LoginInfo.url = "aaa"
print(LoginInfo.port)
- 型プロパティはインスタンスの属性としてアクセスできない
- 型名.プロパティ名という形式でのみアクセスできる
var loginInfo = LoginInfo()
print(loginInfo.userId)
// print(loginInfo.url) // これはエラー
print(LoginInfo.url)