Skip to main content

UI 設定画面と論理演算子

背景

  • UI設定画面の表示設定の実装
  • できる人には難のないことだとは思うが、自分は いつも こんがらがるので、例をもとに整理する

例題

マップアプリで、ピンの種類によって表示を切り替えるようにしたい。

ユーザ設定値意味公園オブジェクトで対応する変数名
isPinWithAdminPhotoVisible管理者の撮った写真ありの公園のピンを表示hasPhotoByAdmin
isPinWithUserPhotoVisibleユーザの撮った写真ありの公園のピンを表示hasPhotoByUser
isPinWithoutPhotoVisible写真なしの公園のピンを表示-
isPinOnlyWithChildEquipmentVisible子ども遊具のみの公園のピンを表示isAllEquipmentsForChildren
isPinOnlyWithRemovedEquipmentVisible遊具すべて撤去済の公園のピンを表示!isAvailable

コードで書く場合は簡単なのだけど、and/or でつなげていく必要があるケースで、分からなくなる。

Mapbox の Exp で表現したいので、and/or でつなげるケースで実装が必要になったので、整理した。頭の体操だ。

その前に少し整理

1個の条件だけで「表示する」は確定しないので、
公園に管理者写真あり(タテ) x ユーザ設定で「公園写真あり」を表示(ヨコ) で表を作ると、こんな感じになると思う。

表示する設定(T)表示しない設定(F)
公園に管理者写真 あり (T)- 未確定x 「非表示」で 確定
公園に管理者写真 なし (F)- 未確定- 未確定

いつも、脳内で最初にこう考えてよく分からなくなってる気がする。

表示する設定(T)表示しない設定(F)
公園に管理者写真 あり (T)o 表示するx 表示しない
公園に管理者写真 なし (F)- 未確定- 未確定

コードで書く場合

擬似コードでこんな感じ。

早期リターン的に書くことで、ほか 3 つの組み合わせを考えなくて良いので楽。

ただ、コードは長いな。

swift
func isVisible() {
// 独立したもの
if park.isAllEquipmentsForChildren {
if conf.isPinOnlyWithChildEquipmentVisible {
return false
}
}
if !park.isAvailable {
if conf.isPinOnlyWithRemovedEquipmentVisible {
return false
}
}

// 関連したもの
if park.hasPhotoByAdmin {
if conf.isPinWithAdminPhotoVisible {
return false
}
} else if park.hasPhotoByUser {
if conf.isPinWithUserPhotoVisible {
return false
}
} else {
if conf.isPinWithoutPhotoVisible {
return false
}
}
return true
}

and/or でやる場合

なんか微妙に条件が違う気がするが、こんな感じ?

ややこしいかと思ったが、短くて済むな。

swift
func isVisible() {
not (
(park.hasAdminPhoto && !conf.isPinWithAdminPhotoVisible)
|| (park.hasUserPhoto && !conf.isPinWithUserPhotoVisible)
|| (!(park.hasAdminPhoto || park.hasUserPhoto) && !conf.isPinWithoutPhotoVisible) // ここが若干煩雑か
|| (park.isAllEquipmentsForChildren && !conf.isPinOnlyWithChildEquipmentVisible)
|| (!park.isAvailable && !conf.isPinOnlyWithRemovedEquipmentVisible)
)
}