Swift 3.0 で C言語スタイルの for ループが廃止されるので、その書き換え方法のまとめ
http://qiita.com/codelynx/items/899c26dd2cbdba7d2b00
にも書きましたが、飛び石になる for
ループを実装した場合は、Strideable
プロトコルを実装してあげるのが良さそうです。そこで、Int
や Double
とかではなく、独自のタイプの場合どう書けば Strideable
を実装できるか試してみる事にしました。
その型の名前は考えたあげく Score
にしました。単に、整数 value
を持つだけです。 Strideable
に適合する為には、distanceTo()
と advancedBy()
を実装するのと、さらに Comparable
, Equatable
のプロトコルも実装してあげます。
struct Score: Strideable, CustomStringConvertible {
typealias Stride = Int
var value: Int
init(_ value: Int) {
self.value = value
}
func distanceTo(other: Score) -> Int {
return other.value - value
}
func advancedBy(n: Int) -> Score {
return Score(self.value + n)
}
var description: String {
return String(value)
}
}
func < (lhs: Score, rhs: Score) -> Bool {
return lhs.value < rhs.value
}
func == (lhs: Score, rhs: Score) -> Bool {
return lhs.value == rhs.value
}
では、0 から 100 未満まで 25 づつ stride してみましょう。
for score in Score(0).stride(to: Score(100), by: 25) {
print(score) // 0, 25, 50, 75
}
0 から 100 以下まで 25 づつ stride してみましょう。
for score in Score(0).stride(through: Score(100), by: 25) {
print(score) // 0, 25, 50, 75, 100
}
できました。うまく動くようです。個人的には by の値が Score で指定できないのは、少し引っかかりますが、まぁ良しとします。浮動小数点数を扱いたい場合は… 是非試してみてください。
この記事を書く間に何度も、「Strippable」と打ってスペースキーを押すと「Strippable」に自動変換してくれるのが驚きでした。Appleさん。
では、皆さん Have a happy coding!!
swift --version
Apple Swift version 2.2 (swiftlang-703.0.18.1 clang-703.0.29)
(参考資料)
https://ez-net.jp/article/24/eO3YibBI/bKdTpaUfz0Ou/
Swift のインデックス型を理解する