Swift 新規入力か編集モードの切り分け実装方法
ある画面が、新規入力かそれとも既存データの更新かを切り分ける実装について
// 名前:新規の場合、デフォルト名を見本として表示する if editMode == .New { uiName.placeholder = datPerson?.name lastMeeting = datPerson?.lastMeeting } else { uiName.text = datPerson?.name }
なんだか見慣れない書き方と思うかもしれない。
if editMode == .New
これは何かと言うと
EditMode列挙体の型でインスタンスを生成しておく。
private var editMode: EditMode = .Empty
これを列挙体で持っておく
こうすると間違いが少ない。いちいち数字を入れていると間違えのもと。
宣言はこのようにする。
/// - Empty: 該当無し(検索と訪問先の画面で検索結果が空,...等) /// - New: 新規登録 /// - Existing: 既存訪問先(詳細表示と編集) enum EditMode: Int { case Empty case New case Existing }
ちなみに列挙体ではInt型のrawValueには、デフォルト値が存在し、値を指定しなければ、デフォルトが割り当てられる。 便利ですね。
はじめは0から1.2.3と割り当てられます。
なので
EditMode.Empty.rawValue // 0が入っています。
これで新規入力か更新の処理は分けた。 その後値を代入していくのだが、更新の場合、nilが怖い。 そのような場合
nilの可能性があるものは中値演算子 ??を利用する。
例えば
ptfMstBunrui.selectedMstItem = datPerson?.mstBunrui ?? nil
中値演算子とはなんぞや?
定義
まず左辺がオプショナル型、それが値を持っていれば、アンラップした値を入れる。
左辺が値を持っていなければ ?? のあとの数値を代入する。
datPerson?.mstBunrui (オプショナル型)が値を持っていれば、それをアンラップして左辺へ代入する。 そうでなければnilを入れましょう。という事 書き直せば
if let _ = datPerson?.mstBunrui{ ptfMstBunrui.selectedMstItem = datPerson!.mstBunrui }else{ ptfMstBunrui.selectedMstItem = nil }
こういうことになります。