swift
1for variable in range {
2 statements
3}
の構文の機能を想像するに以下のようになっていると思います。
(1) rangeを計算し、Rangeインスタンスを生成する
(2) ループの度にRangeインスタンスから値を順番に取り出し、variableへ束縛してstatementsを実行
strideというのは(多分)swift言語の構文ではなく単なる関数じゃないでしょうか?
print(type(of: stride(from: 1, to: 10, by: 2)))
ってやってみるとStrideTo<Int>
って表示されるので。
関数の引数なので、それはループの度に行うべき「計算式」を指定できるような場所ではなく、Rangeインスタンスの列挙の仕方を決める単なる「値」だと思います。つまりk += m
を指定すべきではなく単に増分値としてm
を渡すのが適切だろうと思います。そもそもループが開始してもいない状況で(1)が計算されるわけなので、kという変数をstrideの引数には使えません。(エラーメッセージが言わんとしていることはそういうことでしょう)
追記:本回答はstrideに対してのみのものです。他にも間違いがあるのですが、詳細な説明は省略して「こういうふうにするととりあえず動いた」という例のみ挙げておきます。唯一の正解ではないのですが元のコードとの違いに着目して考えてみてはいかがでしょうか?
swift
1var A: [Int] = [0, 0]
2for _ in 2...100 {
3 A.append(1)
4}
5for m in 2...100 {
6 for k in stride(from: m * 2, to: 101, by: m) {
7 A[k] = 0
8 }
9}
10for i in 0...100 {
11 if A[i] == 1 {
12 print(i)
13 }
14}
余談:
ループの範囲を指定する際、よく0..<N
というRange指定をします。なぜそうするかといえば配列の指標が1ではなく0から始まるためN個の指標を列挙するには0~N-1の範囲としなくてはならず、そのため終端の値を指定するのにNから1を引くのが「すっきりしない」という感覚から0..<N
と書く習慣があるからだと思います。一方「STARTからEND(その値を含む)まで」を指定したいならSTART...END
と指定するのが自然と思います。「1から100までの間」を表現するのにわざわざ終端値に1を加えて1..<101
としなくても1...100
の方が自然に感じます。
これらは人それぞれの好みによっても違うかも知れません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/18 13:52
2018/02/19 00:36