#プロパティ
プロパティとは、型に紐づいた値のことで型が表すものの属性の表現などに使用されます。
車を例にしますと、車は車種やタイヤ、エンジンなどの属性を持っています。
これを型とプロパティの関係で表すと、
車という型は、車種やタイヤなどのプロパティを持っているということになります。
車種は車によって異なりますので、
プロパティは型のインスタンスに紐づいた変数や定数であるとも言えます。
##定義方法
プロパティはvarキーワードもしくはletキーワードで定義します。
変数や定数と同様に、varキーワードは再代入可能なプロパティを定義し、
letキーワードは再代入が不可能なプロパティを定義します。
定義する際のコードは下記のようになります。
struct 構造体名 {
var プロパティ名: プロパティの型の値 = 式 // 再代入可能なプロパティ
let プロパティ名: プロパティの型の値 = 式 // 再代入不可能なプロパティ
}
プロパティにアクセスするには、型のインスタンスが代入された変数や定数に
.(ドット)
とプロパティ名
をつけて変数名.プロパティ名
のように記述します。
私が将来乗りたい車であるレクサスを例にしてコードを書いてみます。
let myCar = Car()
で、定数myCarに対してCar型の構造体をインスタンス化しています。
struct内で定義された定数nameに対してアクセスするためには、
変数名.プロパティ名の形で記述するのでmyCar.name
という形になります。
struct Car {
let name = "LEXUS LS" // 車名
let price = 9000000 // 値段
var mileage = 20000 // 走行距離
}
let myCar = Car()
print(myCar.name)
print(myCar.mileage)
実行結果
LEXUS LS
20000
プロパティの型の整合性を保つために、
インスタンス化の完了までに全てのプロパティに値が代入(=初期化)されてなければいけません。
初期化されていないプロパティが存在するとコンパイルエラーが発生します。
したがって、全てのプロパティは、宣言時に初期値を持っているか、
イニシャライザ内で初期化されるかのいずれかの方法で値を持つ必要があります。
(イニシャライザに関しては別の記事に記載してあります。)
##プロパティの分類
プロパティは、紐付く対象により2種類のプロパティに分類することができます。
前者のプロパティの方が主流ですが、
ぜひ両方とも覚えておきましょう!
###インスタンスプロパティ
インスタンスプロパティとは、型のインスタンスに紐付くプロパティになります。
インスタンスに紐付くため、
インスタンスごとに異なる値を持たせることができるのが特徴です。
単にプロパティと呼ぶ場合はこちらを表すことが多い気がします。
varやletで定義したプロパティはデフォルトではインスタンスプロパティとなります。
なので、先ほどの車の例で出たプロパティは全てインスタンスプロパティです。
下記の例では、同じ型を使ってインスタンス化しても、
異なるインスタンスになるので異なった値を持たせることができます。
struct human {
var name = "Aoki"
var age = 11
}
let human1 = human()
var human2 = human()
human2.name = "Tanaka"
print(human1.name)
print(human2.name)
実行結果
Aoki
Tanaka
###スタティックプロパティ
スタティックプロパティは型のインスタンスではなく型自身に紐付くプロパティで、
インスタンス間で共通する値の保持などに役立ちます。
スタティックプロパティの定義方法は簡単で、
プロパティの宣言時に先頭にstaticキーワードを追加するだけです。
スタティックプロパティは他のプロパティとは異なり、
型名.スタティックプロパティ名
で値を参照することができます。
例として、メールに関する構造体Mailを作成してみました。
宛先は毎回同じでいいので、static let from
のように
スタティックプロパティで定義しております。
このスタティクプロパティにアクセスする際にはMail.from
でアクセスします。
また、func mailer(mail: Mail) { }
のように、
引数の型を今回作成したMail型にしていますので、
let mail1 = Mail()
でインスタンス化したMail型のmail1を引数に渡すことができます。
struct Mail {
static let from = "Tanaka for iPhone"
var to = "Matsumoto"
var body = "Hello!"
}
func mailer(mail: Mail) {
print(Mail.from)
print("To:\(mail.to)")
print(mail.body)
}
let mail1 = Mail()
var mail2 = Mail()
mail2.to = "Okada"
mail2.body = "See you Okada"
mailer(mail: mail1)
print("---")
mailer(mail: mail2)
実行結果
Tanaka for iPhone
To:Matsumoto
Hello!
---
Tanaka for iPhone
To:Okada
See you Okada
プロパティ前編は以上になります。
結構長くなりそうなので、前編と後編に分けました!
後編の方が大切な内容が書かれているのでぜひご覧ください。
後編はコチラ
-> 【Swift】型の構成要素〜プロパティ後編〜
最後までご覧いただきありがとうございました。