見出し画像

【じっくりSw1ftUI 22】Essentials第10章〜Playgroundで遊ぼう⑧Swiftオブジェクト志向プログラミング❶Class(クラス)の基本

あけましておめでとうございます。
今年もよろしくお願いいたします。

それじゃ今年も、

オイラの学び直しにお付き合いを〜〜〜

前回

までで、

関数の基本的な組み方とかクロージャあたり

まで確かやってるから、その続き。今回は、前回の最後でゆーてたとおりオブジェクト志向(指向)言語の醍醐味でもある

Class(クラス)

からやってく〜〜〜🕺

ゆーてあんまりオイラのこれまでの開発現場では、

Classってもの自体をあんまり使った記憶がないんだよね🤔VBAでもGASでも、、、💦

その理由はってゆーと、

業務自体がグニャグニャしているのが普通だから
👉必ずこれで未来永劫変わりませんって感じのツール自体を開発することがない
=関数とかfunction、プロシージャなんかで臨機応変に繋いで、

可読性と変更可能性

なんかを維持しながら、

保守性=メンテナンスや改修のしやすさを高めることがほとんどだから。

ま、あくまでも、オイラが経験してきた職場での話で、逆にガッチガチにフェーズ型で開発してるところでは、クラスは存分に威力を発揮するとは思うので、

基本を理解していて損はないかな

っと。これって、

フェーズ型かインクリメント型か
👉フロントエンド・エンジニア vs データベース・エンジニア
=きのこ・たけのこ論争みたいなもん

って結構、開発業界では一番古典的で最新の不毛な争いでもあるので、興味のある人は、

でも載ってるし、読んでみてね👀感想文でよければ、過去に、

以降の記事なんかで触れてたりはする。。。

個人的には、

業務とかユーザビリティを理解しようとしないDB屋さんは何故、

DB設計の最初からCONSTRAINTしたがるのか

そして、現場の業務を知らしない上司ほど、何故、

専門用語を並べ立てるDB屋を採用したがり、使えないDBを作らせて現場を混乱に陥れるのか

って思ってたんだけど、この本を読んで

ああ、要はリファクタリングって手法すら知らないのね👀

って思い至った次第 笑🤣
と話が相変わらず脱線しまくってるので、そろそろ本題🙇‍♂️

Essentials10章をじっくり読んでく

概要部分では、

「オブジェクト志向言語の話をしようとすると、ひっじょうに強力なんだけど、話が壮大だし、全部網羅するのは無理だから、Swiftが提供してるオブジェクト志向言語の基本について話すべ」

って感じのことを書いてんね👀

第1節で

オブジェクト(クラスインスタンス)とはそもそもなんぞやって感じから入ってんね。で平たく言っちゃうと、

簡単に利用したり、再利用できたりする
ソフトウェアアプリケーションの部品のことだよ

って書いてて、、、インスタンスも

データ型を定義したプロパティって呼ばれるもの:状態
関数なんかを定義したメソッドって呼ばれるモノ:処理

で、クラスのメンバーとして定義しちゃえば、いとも簡単に正確にアクセスできるからね〜〜〜

ってことを書いてんね👀毎度のことながら、

動かしたこともない人からしたら、
なんのことやらイメージが湧かない

って説明かもしれないけど、動かしたことのある人間からしたら、

英語でとはいえ、

こんなに簡潔に的を射た説明をするとは驚く👀

って感じ💦日本語の市販の本と違って

〇〇することができます

みたいにやたら無駄に冗長な文章の繰り返し(〇〇できますで良いだろ)と、入門って言いながら最低限のことは説明しなくてもわかってるだろ前提で最初から専門用語を多用しないところが、

尖ってて良い感じ🕺

第2節以降でクラスの具体的な説明に入っていってんので、余計な説明はここまでで〜〜〜

クラスの定義方法

class クラス名: 親クラス {
    //プロパティ
    //インスタンスメソッド
    //タイプメソッド
}

とここですでに、

親クラス

が出てきてるけど、

継承

については多分、このまま読んでいくと説明があるでしょ💦なのでここまま読み進めると、とりあえず、

この章で全体で使うクラス

を定義して話を進めるみたいなので、、、サンプルクラスをこの記事でも準備しよ🕺ま、テケトーに〜〜〜

class ProfileAccount10_1 {
    
}

てな感じで、クラスを一個作ってみた👀

プロパティを設定

ま、大事なところなんでしっかりカプセル化についても書いてるけど、要は

class ProfileAccount10_1 {
    
}

class ProfileAccount10_1 {
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
}

てな感じで、このクラスの{}の中だけで取り扱う引数(変数や定数)に値を格納して、

プロパティを設定できるよ

ってことで。。。で次は、

メソッド定義

なんだけど、メソッド定義には2種類あって、、、

  • タイプメソッド:クラスレベルで使う

  • インスタンスメソッド:クラスの中で使う

があるんだけど、ちょっとここも一概にそうとばかりは言えないんじゃないか?🧐と感覚的には思うので、誤ったイメージで分かった気になる前に実践

タイプメソッド(クラスの中でfunctionを定義)

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
}

てな感じ

インスタンスメソッド(今回は最小値を設定)

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}

インスタンスを宣言して初期化

var myProfile: ProfileAccount10_1 = ProfileAccount10_1()

てな感じで

実行すると、呼び出し出来てるね👀

イニシャライザとデイニシャライザ

イニシャライザって、、、

なんかを参考に、

  • 型の整合性が取れない

  • メモリ安全でない(メモリ確保、初期化がされる前にインスタンスにアクセスしてしまう)

って自体に備えて、

プロパティを綺麗に初期化しちゃう手法ってことね、、、、💦

実際に、イニシャライザを使うと、、、

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 40, m_KakuWeight: 50)
なんだけど、

初期値が必要だから、

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
//何も変更しないままだと
var myProfile: ProfileAccount10_1 = ProfileAccount10_1()
てな感じでエラーになってしまう

デイニシャライザについては、

なんかを参考にしてもわかるとおり、

  • デイニシャライザはクラスのインスタンスが破棄される時に自動的に呼ばれる特殊なメソッド。

  • メモリに確保されたインスタンスやプロパティはARC(Automatic reference counting)によって自動的に破棄されるので通常はデイニシャライザを記述する必要なし。

  • 例:ファイルを扱うクラスで、開いたファイルをインスタンスの破棄時に確実に閉じるためにデイニシャライザを利用できる。

てのを読んでもわかるとおり、あまり使うことはないと思うので〜〜〜

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)

コードだけ記載しとくね👀💦
そんなに使った記憶すらないもんで、、、。
でやっとこ定義したプロパティとかメソッドの遊び方に行き着くんだが、、、

呼び出して実行してく〜〜🕺

class ProfileAccount10_1 {
    //プロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
イニシャライザで、きちんとAgeに入れた値になってるね👀
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()

を追加しても、、、

てな感じで出来ちゃってんね👀
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
てな感じのこともできちゃう👀

ストアドプロアティとコンピューティッドプロパティ

プロパティも大きく二つに分かれて、、、

も参考に

  • ストアドプロアティ:毎回固定値のプロパティ

  • コンピューティッドプロパティ:初期値がないけど、計算結果を返すプロパティ

てことらしい

これだけだとなんじゃらホイって感じなので〜〜〜

なんかを参考に〜〜〜

class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
//BMI計算結果を呼び出す
var myBMI = myProfile.calcBMI
print(myBMI)
てな感じで計算結果を呼び出すことができる〜〜〜
たった、1行だから使い回せる

getterでの計算結果をsetterにセットして、

class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    var himanFlg: Bool = false
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
        set(resultBMI) {
            if resultBMI > 25 {
                himanFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
//BMI計算結果を呼び出す
var myBMI = myProfile.calcBMI
print(myBMI)
//肥満かどうかの判定
var myFat = myProfile.himanFlg
if myFat == false {
    print("肥満じゃないです")
} else {
    print("肥満に注意")
}
てな感じで遊ぶことも可能

と、ここでいつも健康診断なんかで疑問だったんだけど

25未満は肥満ではないのであれば、逆に

自分が何キロになったらBMI的には肥満なのか

って計算も

class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    var himanFlg: Bool = false
    var notFatFlg: Bool = true
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
        set(resultBMI) {
            if resultBMI > 25 {
                himanFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //コンピューテッドプロパティ:肥満未満の体重上限
    var nonFatMyWeight: Float {
        get {
            return 25 * (m_KakuHeight * m_KakuHeight)
        }
        set(weightFatResult) {
            if weightFatResult - m_KakuWeight > 0 {
                notFatFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
//BMI計算結果を呼び出す
var myBMI = myProfile.calcBMI
print(myBMI)
//肥満かどうかの判定
var myFat = myProfile.himanFlg
if myFat == false {
    print("肥満じゃないです")
} else {
    print("肥満に注意")
}
//肥満未満になる体重上限値を取得
var myNotFatMax = myProfile.nonFatMyWeight
print(myNotFatMax)
var notFatFlg = myProfile.notFatFlg
if notFatFlg == true {
    print("まだ太れます")
} else {
    print("運動しましょう")
}
判定結果も踏まえてできちゃうよね〜〜〜

クリエイターの目線から(今回の一番大事なポイント)

オイラはいっつも、

コロナ禍でテレワークとかフルリモートなんかをやってると、
運動したくても出来ないことが多くなってたのに、
運動しましょうって感じで、今の体重が肥満かどうかを教えてくれる体重計とかはあるのに

何キロになったら肥満か
👉あと何キロまで太っても肥満じゃないか

を教えてくれる体重計がないのが不思議だったんだよね〜〜〜👀
まあ、去年、

なんかで散々、書いたとおり、

健康維持には運動するのが当たり前ってレジティマシーが強い
👉脳筋マッチョな医学とかスポーツ界の常識

が原因なんだろうけど、

  • 災害や事故で骨折してしばらく運動ができない

  • 世界的な疫病で運動したくても、ジムが閉まっていて運動できない

なんて状況をオイラたちはここ数年で経験して、

でも書いてるハロー効果やドーパミン効果を悪用した、

不安を煽って消費に繋げる=悪意ある経済
👉ただお金が儲かれば良いのか?

から、

でも書いた

人の不安を煽らず必要な消費に繋げる=倫理ある経済
👉いかにお金を稼ぎ循環型の経済に社会を変えていくか

に繋がると思うしね、、、。この

略して、Essentials

のSyntax以降で出てくるであろうSwiftUIのフレームワークなんかで身長をメートル単位で入力だけしてもらえれば、

痩せ型は何キロ以下、肥満は何キロ以上

って判定や適正体重なんかも、

体重計なしにスマホひとつで計算できる

から、さっき書いたような事情で、運動がしたくても中々できないって人に、

無理に不安感を煽ったり、罪悪感を持って運動する

なんてことも減るだろうし、今、世界的な社会問題になりつつある

のダイエット目的の消費抑止にも繋がると思うしね。。。。👀そのきっかけは、ただ単に、

体重計で使ってるBMIの計算方法を逆転させただけ
👉よくいう発想の転換
(ゆーばかりでやれてない経営者ばかりだけど)

なんだけどね。ま、だからまだ運動しなくても大丈夫とか、健康を維持できるなんて豪語するつもりもないし、スマホアプリにそこまでの力なんてもちろんないけど、

テレワークや災害・事故、美容なんかで強迫観念を持ってる人の不安を少し減らすことができるかもしれない
👇
技術を正しく使えば、そんなことも出来るし、
最新の技術にはそんな力を秘めてる

ってことなんだけどね👀世の中に、数百万くらいあるスマホアプリを全部見てるわけでもないから、すでに存在してるかもしれないし、別にそれをオイラが作らないといけないとかこんなアイデアを独り占めする気もないから今ここで書いてるけどね。

どんな技術もツールも使い方ひとつで、

世界中のすべての人を幸せに豊かにすることも出来れば、
ごく一部の人間だけで、利益も富も独占出来るように悪用することも出来る

ってことで、、、。

去年で、

書きたかった記事はSwiftUI以外はあらかた全て書き終えてる(1年間で580記事くらいかな)から、今年からあんまり趣味のSwiftや古典、音楽、英語以外は書く気もないけどね。

オイラのこんな話なんて一個人のただの私見とか持論に過ぎないから、プロスペクト理論で、いくらでも

そうなるとは限らない

で一蹴してくれていいけど、年末年始も新聞を隅々まで読んでて今年は、

日本が色々な意味で完全に再生(ReStart ,Reset,Reborn)が始まる年

で、自分の所属する会社とか、研究室とか地域といった範囲でしか物事を見れなかった人たちが、

自分のいる産業、学会、社会といった範囲に行動範囲自体を広げないと淘汰されるしだろう。本格的に淘汰が始まる最初の年だろうな

って見てるんだよね👀実際、

すでに4月から運輸や医学会なんかで時間外労働の規制が始まることで去年から政治や経済が大好きな人たちは右往左往してるのが象徴的な出来事だしね。

まとめ

とまあ、普段の生活だとあんまり見られない

イノベーションの萌芽=閃き(ひらめき)

をこの記事を書いていてひらめいてしまったのと、次に節がちょうど

Lazy

関係で、ちょっとクラスの中でもここから毛色が変わるかなっと思ったのもあるし、何よりこの連載が終わって、SwiftUIでひと通りアプリが作れるようになった読者さんが、いざ自分でアプリを作ろうって時に必要になるのが、コード云々よりも、

イノベーションの萌芽がどのように生まれるか

だと思ったから、テクニカル系の記事でいつになく熱く語ってしまった💦

世の中を変えるとか、

イノベーションを起こす、社会を変える、独立する億万長者になんてご大層にゆーてる人ばかりだけど、

社会や社会の空気が変わるきっかけなんて
どんな偉人の活動もそんなもん

今の自分の関心や記事のお題がSwiftUIだから、自分には関係ない、Swiftのことだけ書けなんて思ってても、いざ

  • 自分でゼロからアプリを作ろう

  • アプリが収益化できたから経営しよう

なんてことになったら数ヶ月後〜数年後にはすでに自分事になるんだから。

世の中もシステムも

全ては繋がっている=色即是空

フィッシャーの基本定理ではないけど、いつの時代も変化する度に変化に対応できずに淘汰される、右往左往してるのは、

次の変化に備えなかった人たち
👉その時になって、右往左往したいか、
今関係ないと思っても、経験者の話は素直に聞いておくか
最初の違いなんて、ただそれだけ

そもそも、オイラはこのマガジンを始めた時に、

SwiftUIの記事だからSwiftUIのことしか書きません

なんてゆーたつもりは一切ないし、そんな無粋なことをするくらいなら、

そもそも、労力のかかる記事なんて作らずに
自分だけでアプリ開発してる方がマシ

だからね。

あ、そうそう今回はまだまとめコードを書かないけど、

まだ、本章の半分くらいしか実は行ってないんだけど、この記事で扱った

最初のコード

class ProfileAccount10_1 {
    
}

最後のコード

class ProfileAccount10_1 {
    //ストアドプロパティ
    var m_KakuAge: Int = 43
    var m_KakuWeight: Float = 68.9//キログラム
    var m_KakuHeight: Float = 1.7//メートル
    var himanFlg: Bool = false
    var notFatFlg: Bool = true
    //コンピューテッドプロパティ:BMI計算
    var calcBMI: Float {
        get {
            return m_KakuWeight / (m_KakuHeight * m_KakuHeight)
        }
        set(resultBMI) {
            if resultBMI > 25 {
                himanFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //コンピューテッドプロパティ:肥満未満の体重上限
    var nonFatMyWeight: Float {
        get {
            return 25 * (m_KakuHeight * m_KakuHeight)
        }
        set(weightFatResult) {
            if weightFatResult - m_KakuWeight > 0 {
                notFatFlg = true
            } else {
                himanFlg = false
            }
        }
    }
    //イニシャライザ
    init(m_KakuAge: Int, m_KakuWeight: Float) {
        self.m_KakuAge = m_KakuAge
        self.m_KakuWeight = m_KakuWeight
    }
    //デイニシャライザ
    deinit{
        print("deinit")
    }
    //タイプメソッド
    func msgMyProfile(){
        print("オイラは\(m_KakuAge)のおっさんだぞ")
        print("オイラの体重は\(m_KakuWeight)だよ。運動せんと、、、💦")
    }
    //インスタンスメソッド
    class func getMinimunWeight() -> Float {
        return 49.9
    }
}
var myProfile: ProfileAccount10_1 = ProfileAccount10_1(m_KakuAge: 42, m_KakuWeight: 59.0)
//初期化したインスタンスからプロパティ呼び出し
var myAge = myProfile.m_KakuAge
print(myAge)
//違う年齢を代入して
myProfile.m_KakuAge = 52
//タイプメソッド呼び出し
myProfile.msgMyProfile()
//インスタンスメソッド呼び出し〜〜
var minWeight = ProfileAccount10_1.getMinimunWeight()
//自分の体重を48.9に代入
var myWeight = myProfile.m_KakuWeight
myWeight = 48.9
//比較して〜〜
if myWeight > minWeight {
    print("良い感じ")
} else {
    print("痩せ過ぎじゃない?")
}
//BMI計算結果を呼び出す
var myBMI = myProfile.calcBMI
print(myBMI)
//肥満かどうかの判定
var myFat = myProfile.himanFlg
if myFat == false {
    print("肥満じゃないです")
} else {
    print("肥満に注意")
}
//肥満未満になる体重上限値を取得
var myNotFatMax = myProfile.nonFatMyWeight
print(myNotFatMax)
var notFatFlg = myProfile.notFatFlg
if notFatFlg == true {
    print("まだ太れます")
} else {
    print("運動しましょう")
}

如何にクラスが強力か

イメージしてもらえれば十分だし。これ以上、ひとつの記事でやって、

今回、初めてやる人がこれ以上複雑になるコードを理解できると思うかい?

って話。そして、BMIとか消費税計算くらい、規則性とか普遍性がある程度あるものなら良いけど、

普段の業務で、人の判断が間に介在せすに、大掛かりな処理を繰り返すだけの仕事がどれだけあるんだろうね👀

クラス化に向くか向かないか

👉そしてこの記事の振り出しに戻る。

さてと、次回は

💃Classの後半。レジーストアドプロシージャからやってく〜〜〜🕺
3連休も暇なんで、明日かな
💦👀

この記事が気に入ったらサポートをしてみませんか?