質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

329閲覧

for in stride の使い方

cyan-drop

総合スコア16

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/02/17 14:28

分からないこと

素数を取り出すプログラムで、for in strideを使って繰り返し処理を行いたいのですが、うまくいきません。
処理としては配列Aから、2〜100の倍数を取り除きたいです。

該当のソースコード

var A: [Int] = [] for k in 2..<101 { A.insert(1, at: k) } for m in 2..<101 { for k in stride(from: 2*m, to: 101, by: k += m) { A.insert(0, at: k) } }

表示されているエラーメッセージ

main.swift:8:45: error: use of unresolved identifier 'k' for k in stride(from: 2*m, to: 101, by: k += m) { ^ main.swift:7:5: note: did you mean 'm'? for m in 2..<101 {

試したこと

for var k in stride...と書き換えてみましたがエラーメッセージが変わりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/17 16:37

編集2018/02/18 23:22
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cyan-drop

2018/02/18 13:52

回答ありがとうございます! kが使えない理由がよくわかりました! それで、mに置き換えたところRun errorというものが出たのですが、 forを諦めてwhileなどで代用したほうがいいのでしょうか? さらに質問で、すみません????
cyan-drop

2018/02/19 00:36

詳しい解説本当にありがとうございます‼︎ 自分の書いたコードと比較して、何が原因なのかちゃんと勉強したいと思います。 ’<=’と同じ意味を持つ書き方も知らなかったのでとても参考になりました。 コードも行いたかった素数を出すところまで書いてくださり、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問