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 } } }
参考にさせていただきました。