Rangeのメソッド
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 9/56。
Rangeは本物のCollectionなので、配列で使うのと同じツールボックスが備わっています。
contains、count、first、および last はすべて直接動作します:
let r = 1...10
print(r.contains(5)) // true
print(r.count) // 10
print(r.first!, r.last!) // 1 10これまで使ってきたほとんどの配列メソッドも同様に動作します。範囲をフィルタリングした結果はそれ自体が範囲ではないため、filter は配列を返します:
let evens = (1...10).filter { $0 % 2 == 0 }
print(evens) // [2, 4, 6, 8, 10]reduceについても同様です。範囲(range)もこれを備えており、素早い合計や積の計算に活用することになるでしょう。
チャレンジ
簡単2つの整数(2行): n と target を読み込みます。閉区間 1...n をデータセットとして扱ってください。
以下の3行を出力してください:
targetが範囲内に含まれる場合はtrue、そうでない場合はfalse- 範囲内のすべての値の積(
n!: 階乗)。reduceを使用してください。 - 範囲内の値のうち
3の倍数 であるものを,で連結したもの(該当するものがない場合は空行)。filterを使用してください。
入力が 5 / 3 の場合、出力は以下のようになります:
true
120
3チートシート
範囲(Range)は Collection に準拠しており、一般的なコレクションメソッドをサポートしています:
let r = 1...10
r.contains(5) // true
r.count // 10
r.first! // 1
r.last! // 10範囲に対して filter を使用すると、配列が返されます:
let evens = (1...10).filter { $0 % 2 == 0 }
// [2, 4, 6, 8, 10]reduce は範囲に対して直接動作します:
let product = (1...5).reduce(1) { $0 * $1 } // 120
let sum = (1...5).reduce(0, +) // 15自分で試してみよう
let n = Int(readLine()!)!
let target = Int(readLine()!)!
let r = 1...n
// TODO: contains(target)、reduceによる積、filterによる3の倍数
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。