swift isUserInteractionEnabledについてまとめる

関数定義

var isUserInteractionEnabled: Bool { get set }

これを見るとgetterとsetterをもった変数であることがわかる。

didset,ポイント

//画面の編集ができるかどうか?
//usageSceneに .Editingがセットし終わった後にconfigUsageSceneが呼ばれる
  var usageScene: UsageScene = .Editing {
        didSet { configUsageScene() }
    }

実践コード

  /// 画面使用シーンに合った状態にする
//configUsageScene関数定義
    private func configUsageScene() {

//canDisplyDataがtrue
        if canDisplyData &&
//かつ ここも評価 true falseしか返さない
            uiEnabler.isUserInteractionEnabled != (usageScene == .Editing) {
// usageScene == .Editingは、評価 true falseしか返さない
            let enable = usageScene == .Editing
            uiEnabler.isUserInteractionEnabled = enable
        }
    }

実装コードリファクタリング

これだと読みやすい

   private func configUsageScene(){
        guard canDisplyData else {
            return
        }
        switch usageScene {
        case .Editing:
            uiEnabler.isUserInteractionEnabled = true
        default:
            uiEnabler.isUserInteractionEnabled = false
        }

変数まとめ

//DBの編集ができるかどうか?
 private var canDisplyData: Bool = false


   /// - Viewing: 閲覧シーン(編集不可能)
    /// - Editing: 編集シーン
    enum UsageScene: Int {
        case Viewing
        case Editing
    }

ポイントは、時々、自動保存 と 何らかの振る舞いを持つプロパティが必要だということです。 g

ここを見るとusageSceneがお互いを参照しているように見える なぜ、落ちないのか?

それには、コンピューティッドプロパティの理解が必要になります。 コンピューティッドプロパティはそれ自体は値を持ちません。 そしてアクセスするごとに計算をし直します。

自動保存やなにかの振る舞いを持つプロパティが必要になります。これがポイント

get/setだけであれば、値を保持するための別のフィールドが必要になります。 でも willSetとdidSetを使用すると、別の変数を持たずに、値が変更されたときにアクションを実行できます。

class Hogehoge {
//myPropertyに0がセットした後に、didsetが呼ばれる
    var myProperty: Int = 0 {
        didSet {
            print("The value of myProperty changed from \(oldValue) to \(myProperty)")
        }
    }
}

getter setterの場合

もう一つ格納する変数が必要。 コードが見やすくなる

class Hogehoge {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("The value of myProperty changed from \(myPropertyValue) to \(newValue)")
            myPropertyValue = newValue
        }
    }
}

参考にさせていただきました。

www.it-swarm.net

www.it-swarm.net