Swiftいろいろ: [1] LogicValue
最近は暇があるとSwiftをいじっている。WWDCのセッションビデオを見直したり、Playgroundをいじったりして気が付いたことを思いつくままに書いてみる。
Swiftでは、色んなプロトコルを実装させることで、様々なデータを組み込みの構文内で使えるようになる。例えば、ifやwhileなどの条件式、Javaなんかだと「boolean」型に限られる訳だが、Swiftの場合、LogicValueプロトコルを実装した型なら何でも使える。
実際によく使われる所で言うとT?(これはOptionalの略記、enum型だったりする)は、LogicValueプロトコルを実装しているので、直接if文の条件部分で使える。
(Optional型…定訳は出来たのだろうか…が実際に値を持つかどうかの判定は、if-letでしか出来ないような書き方をしているSwiftの解説記事があったがそれは間違い。if-let構文を使うと、nilかどうかの判定と、非nilの時のunwrappingが同時に出来る。判定さえ出来れば良いのなら、if-let構文を使う必要は無い。ちなみにwhile-letももちろん使える。)
と言う訳で、LogicValueとextensionを組み合わせると、こんないけないことができてしまう。
よく使うデータ型の中では、他にRangeもLogicValueを実装していて、ifの条件部にRange型の値を返す式を書くと、空範囲かどうかの判定ができる。
Rangeについては、まだ面白いこともあるのでまた次回。
Swiftでは、色んなプロトコルを実装させることで、様々なデータを組み込みの構文内で使えるようになる。例えば、ifやwhileなどの条件式、Javaなんかだと「boolean」型に限られる訳だが、Swiftの場合、LogicValueプロトコルを実装した型なら何でも使える。
実際によく使われる所で言うとT?(これはOptional
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
let rangeA = 0..2
if rangeA {
println("Not empty")
}
let rangeB = 0..0
if ! rangeB {
println("Empty")
}
Rangeについては、まだ面白いこともあるのでまた次回。