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
}

こういうことになります。