[OOPer's page TOP] [新うぱこむへ]
Powered by Google.

OOPer's BBS

[最新発言順リスト] [トップレベル発言リスト]
5162 OOPer: Swift[2014/06/ 3(Tue) 18:50:50] (コメント数12)へのコメント

5167 OOPer: Swiftいろいろ: [1] LogicValue[2014/06/30(Mon) 21:35:32]

最近は暇があると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については、まだ面白いこともあるのでまた次回。

この発言へのコメント…
5168 OOPer: Re: Swiftいろいろ: [1] LogicValue[2014/06/30(Mon) 21:56:24]

[この発言からのツリーを全て読む] [この発言からのツリーリスト]
[この発言より新しい発言を全て読む] [この発言より新しい発言リスト]

[OOPer's page TOP] [新うぱこむへ]