Optional


May 3, 2016

OptionalなBoolの判定をCustom Operatorで解決する

僕がSwiftを使っていて不便だなって思うことの1つに、 OptionalなBool型の条件判定の仕方が面倒というのがあります。 特に、Optional Chainingを使った場合なんかによく遭遇します。 例えば、ログイン中のユーザーがプレミアム会員かどうか判定するときに、 // ログインユーザーが存在して、プレミアム会員の場合という条件式 if UserManager.shared.loggedinUser?.isPremium ?? false { print("Premium user!!") } こんな感じでログイン中ならuserオブジェクトが、非ログインだとnilがloggedinUserに格納される場合なんかに、 loggedinUserがOptionalな型であることでこのなんともいえない条件判定式が出来上がってしまいます。 慣れればどうってこともないのですが、 毎回Optional Bidingで?? falseを付けないといけない この条件の否定を取ろうとすると、!(条件式)と、カッコで括る必要がでてくる といったことが挙げられて、あまりよろしくない…。 ので、 Custom Operator を駆使してこの面倒な点を解消してみようと思います。 Custom Operatorを定義してみる postfix(後置演算子)として、|?を定義してみます。 postfix operator |? {} postfix func |?(b: Bool?) -> Bool { return b.map { $0 } ?? false } こうすることで、OptionalなBoolが、アンラップできて且つtrueなら true を、falseまたはnilなら false を返すことができるようになります。 これを用いると、 if UserManager.shared.loggedinUser?.isPremium|? { print("Premium user!!") } とすっきりかけます!また、 // "プレミアム会員ではないまたはログインユーザーが存在しない場合"という条件式 if ! ... Read more

written by sgr-ksmt