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)
)
}