おはようございます。
swift初学者です。
swiftを勉強している時に、プロパティの種類が多すぎて混乱してしましました。
なので本記事では、備忘録としてプロパティの種類を整理すべく、各プロパティの特徴や性質をしていこうと思います。
#そもそもプロパティとは
プロパティとは、クラスや構造体などに紐付いた値の事を指します。
構造体でいうと以下の通りです。
struct Person {
var name:String //プロパティ
var age:Int //プロパティ
}
let Myname = Person(name:"naoki",age: 23)
print(Myname.name)
このように、クラスや構造体の構成要素になります。
#プロパティの種類
プロパティには主に二つの種類に分けることができます。
値の保持により分類されるプロパティ
定義される対象により分類されるプロパティ
この二つに分類されます。
#値の保持による分類
値の保持による分類は二つ存在します。
ストアドプロパティ
コンピューテッドプロパティ
それぞれの特徴を紹介していきます。
##ストアドプロパティ
ストアドプロパティは値を保持するプロパティになります。
struct Person {
var name:String = "naoki"//プロパティ
var age:Int = 10 //プロパティ
}
let Myname = Person()
print(Myname.name)//"naoki"
print(Myname.age)//10
ストアドプロパティには、値の変更を監視するプロパティオブザーバと言う機能があります。
struct Practice {
// ストアドプロパティ
var training = "push ups" {
willSet { //プロパティ変更前の値
print("Yesterday's training is \(self.training).")
}
didSet {//プロパティ変更後の値
print("Now training is \(self.training)")
}
}
func CallTraining() {
print("Training \(self.training)")
}
}
var practice = Practice()
practice.CallTraining()//Training push ups
practice.training = "Squat"
practice.CallTraining()
//↑
//Yesterday's training is push ups.(willSet)
//Now training is Squat(didSet)
//Training Squat (CallTraining)
willsetでプロパティが変更する前の値を確認できます。
didSetでプロパティが変更後の値を確認することができます。
##コンピューテッドプロパティ
コンピューテッドプロパティは、値を計算するプロパティの事を指します。
**{}**の後に、getを使ってゲッタとsetを使用したセッタを定義して使うことができます。
struct Muscle {
var weight = 30
var Training: String {
// ゲッタを定義
get {
if weight >= 40 {
return "Perfect!!"
}
return "Good!!"
}
// セッタを定義
set {
print(newValue)
}
}
}
var MuscleTraining = Muscle()
let FirstTraining = MuscleTraining.Training
print(FirstTraining)//Good!!
MuscleTraining.weight = 50
let SecondTraining = MuscleTraining.Training
print(SecondTraining)//Perfect
MuscleTraining.Training = "Oh My God!!!"//Oh My God!!!
#定義される対象により分類されるプロパティ
定義される対象により分類されるプロパティには主に三つが挙げられます。
インスタンスプロパティ
タイププロパティ
クラスプロパティ
では順番に述べていきます。
##インスタンスプロパティ
インスタンスを宣言して使用するプロパティをインスタンスプロパティと呼びます。
struct Power {
//インスタンスプロパティ
var weight = 30
}
var MyMuscle = Power()//インスタンスの宣言
print(MyMuscle.weight)//30
print(Power.weight)//エラー
##タイププロパティ
タイププロパティは型そのものに紐付いているプロパティです。
struct Power {
//インスタンスプロパティ
var weight = 30
//タイププロパティ
static var training = "PushUp"
}
var MyMuscle = Power()
print(MyMuscle.weight)//30
print(Power.training)//PushUp
インスタンスを宣言しなくても、型にあるタイププロパティを使うことができます。
##クラスプロパティ
クラスプロパティは、クラスに紐ずくプロパティのことです。
クラスで共通の値を使いたい時に利用します。
class Power {
var weight = 30
class var training: String {
return "PushUp!"
}
}
print(Power.training)//PushUp!
#参考文献
公式ドキュメント
qiita文献
参考にさせていただきました。
ありがとうございます。
#まとめ
種類多すぎてパンクしました。