bbs
oopers.com
5167 OOPer: 2014-06-30 21:35:32 1
Swiftいろいろ: [1] LogicValue
最近は暇があるとSwiftをいじっている。WWDCのセッションビデオを見直したり、Playgroundをいじったりして気が付いたことを思いつくままに書いてみる。

Swiftでは、色んなプロトコルを実装させることで、様々なデータを組み込みの構文内で使えるようになる。例えば、ifやwhileなどの条件式、Javaなんかだと「boolean」型に限られる訳だが、Swiftの場合、LogicValueプロトコルを実装した型なら何でも使える。

実際によく使われる所で言うとT?(これはOptionalの略記、enum型だったりする)は、LogicValueプロトコルを実装しているので、直接if文の条件部分で使える。
var anObject: SomeType?
if anObject {
  println(anObject.description)
}
// if anObject == nil {}とする必要は無い。


(Optional型…定訳は出来たのだろうか…が実際に値を持つかどうかの判定は、if-letでしか出来ないような書き方をしているSwiftの解説記事があったがそれは間違い。if-let構文を使うと、nilかどうかの判定と、非nilの時のunwrappingが同時に出来る。判定さえ出来れば良いのなら、if-let構文を使う必要は無い。ちなみにwhile-letももちろん使える。)

と言う訳で、LogicValueとextensionを組み合わせると、こんないけないことができてしまう。
extension Int: LogicValue {
  func getLogicValue() {
    return self != 0
  }
}
//LogicValueプロトコルで要求されるのはgetLogicValue()メソッドだけ。
var i = 2  //iはInt
if (i) {
  println("i is not zero")
}


よく使うデータ型の中では、他にRangeもLogicValueを実装していて、ifの条件部にRange型の値を返す式を書くと、空範囲かどうかの判定ができる。

let rangeA = 0..2
if rangeA {
  println("Not empty")
}
let rangeB = 0..0
if ! rangeB {
  println("Empty")
}


Rangeについては、まだ面白いこともあるのでまた次回。