[Swift]💩1ヶ月に使うトイレットペーパーの数を計算したい🧻


僕は快便なのでうんち💩をよくします。調子が良い時だと12ロール入りを3週間未満で使い切ります🧻

そこで今回はSwiftを使って1ヶ月に使うトイレットペーパーの数を動的に計算したいと思います😎
(ションベンは無いものとする)

###開発環境
macOS Catalina v.10.15.1
Xcode v.11.3
Swift v.5.1.3


##🧻Playground
計算するだけなので、Playgroundを使います。

まず、1ロールの長さと1ヶ月を定義します👍

```swift

// １ロールの長さはJIS規格で決まっているらしいです。今回は一般的な32.5mで計算します
let length: Float = 32.5
// 1ヶ月を31日とする
let month: Int = 31
```

そして1日にうんこをする数を代入する変数をget,setプロパティで実装します！💩

```swift

var PoopCount: Int {
    get {
        // 日本人が1回のトイレで使うトイレットペーパーの平均の長さ146cm(ググりました)
        let aboutOnceUse: Float = 1.46
        // 1ロールでうんこできる回数
        let oneRollOfPoop = length / aboutOnceUse
        // 22回うんこできる
        return Int(oneRollOfPoop)
    }
    set {
        // 1日で使うロールの長さ
        let daysOfRollLength = Float(newValue) * 1.46
        // 1ロールでうんこできる日数
        let oneRollOfDays = length / daysOfRollLength
        // 1ヶ月に必要なトイレットペーパー
        let totalRoll = month / Int(oneRollOfDays)
        // 4ロール必要
        print("\(totalRoll)")
    }
}
// 1日3回うんこすると...
PoopCount = 3
```

これで1ヶ月に使うトイレットペーパーの数を計算出来ました！
それでは、getとsetプロパティについて説明します👨‍🏫

###🧻get

```swift

get {
        // 日本人が1回のトイレで使うトイレットペーパーの平均の長さ146cm(ググりました)
        let aboutOnceUse: Float = 1.46
        // 1ロールでうんこできる回数
        let oneRollOfPoop = length / aboutOnceUse
        // 22回うんこできる
        return Int(oneRollOfPoop)
    }
```

これは変数が実行される度にgetの処理が実行され、実行結果が返ってきます。
今回の場合だと、PoopCountがInt型なので、Int型にキャストして返してます。

getは読み取り専用なので、今回のような指定した値から計算するだけなら必要ないです、ただ使いたかったので1ロールでうんこできる処理を書きました。💩

###🧻set

```swift

set {
        // 1日で使うロールの長さ
        let daysOfRollLength = Float(newValue) * 1.46
        // 1ロールでうんこできる日数
        let oneRollOfDays = length / daysOfRollLength
        // 1ヶ月に必要なトイレットペーパー
        let totalRoll = month / Int(oneRollOfDays)
        // 4ロール必要
        print("\(totalRoll)")
    }
}
// 1日3回うんこすると...
PoopCount = 3
```
今回のメイン処理となります！
これは変数に代入された値を元に計算を始める処理を書きます！
じゃあその代入した値はどこいくねん？🤔ってなるかと思いますが、setプロパティを使ってる変数に代入した値はnewValueに代入されます！

こういう意味です👇

```swift

var PoopCount: Int {
    get {
        // 日本人が1回のトイレで使うトイレットペーパーの平均の長さ146cm(ググりました)
        let aboutOnceUse: Float = 1.46
        // 1ロールでうんこできる回数
        let oneRollOfPoop = length / aboutOnceUse
        // 22回うんこできる
        return Int(oneRollOfPoop)
    }
    set {
        // 1日で使うロールの長さ           👇ここに来る
        let daysOfRollLength = Float(newValue) * 1.46
        // 1ロールでうんこできる日数
        let oneRollOfDays = length / daysOfRollLength
        // 1ヶ月に必要なトイレットペーパー
        let totalRoll = month / Int(oneRollOfDays)
        // 4ロール必要
        print("\(totalRoll)")
    }
}
// 1日3回うんこすると...
PoopCount = 3    👈この値が
```

##🚽おまけ
他にもwillSetやdidSetを使って値の監視を出来ます👮

###🧻willset
willsetは元ある値よりも代入された値に対して処理を書くことが出来ます。setとほぼ一緒ですね🙆‍♂️

こんな感じ👇

```swift

var PoopCount: Int = 1 {
    willSet {
        if newValue < 1 {
            print("便秘です、食物繊維を摂取しましょう🍠")
        }
    }
}
// 1日にうんこする回数💩
PoopCount = 0
```

###🧻didSet
didSetは代入された値よりも元ある値で処理を書くことが出来ます。
例えば変数の値が動的に変わるとします。その値はDBに保存されていて、ユーザーが前日入力した値が反映される実装をしていると仮定しましょう。
元ある値はoldValueに代入されます。

こんな感じ👇

```swift

var poop = DBの値を読み込ませる

var PoopCount: Int = poop {
    willSet {
        if newValue < 1 {
            print("便秘です、食物繊維を摂取しましょう🍠")
        } else if newValue > 10 {
            print("病院行きましょう🏥")
        } else {
            print("良い感じ！！😆")
        }
    }
    didSet {　👇ここに前日のDBの値が反映される
        if oldValue > 10 {
            print("病院行きましたか？")
        } else if oldValue < 1 {
            print("昨日はうんちしてません😥")
        } else {
            print("快便や😎")
        }
    }
}

PoopCount = 2
```

こんな感じで前日と比較したうんち記録を作成することが出来ます💩


##🧻まとめ🧻

どうでしたでしょうか？文章を読むだけだと理解しずらいと思うので、実際にPlaygroundで試してみてください！
きっと理解できるはずです😆

それにしても、一人暮らしだとトイレットペーパーってあまり使わないんですね、俺はトイレットペーパー を使いすぎなのかな笑