Menu
Coddy logo textTech

Rangeのメソッド

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 9/56。

Rangeは本物のCollectionなので、配列で使うのと同じツールボックスが備わっています。

containscountfirst、および 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)もこれを備えており、素早い合計や積の計算に活用することになるでしょう。

challenge icon

チャレンジ

簡単

2つの整数(2行): ntarget を読み込みます。閉区間 1...n をデータセットとして扱ってください。

以下の3行を出力してください:

  1. target が範囲内に含まれる場合は true、そうでない場合は false
  2. 範囲内のすべての値の積(n!: 階乗)。reduce を使用してください。
  3. 範囲内の値のうち 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の倍数
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン