teratail header banner
teratail header banner
質問するログイン新規登録
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

357閲覧

Swift Int型配列の、1以上の内容の要素に対して、配列番号を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

1クリップ

投稿2017/11/03 12:35

編集2017/11/03 14:34

0

1

###前提・実現したいこと
Int型の配列に0と1以上の要素が複数格納されています。 (e.g. let a:[Int] = [0, 1, 2, 0, 5, 10, 0, 0, 7] )

この配列から、1以上の要素を取り出して、その要素に対して関数を順に実行したいです。(e.g. intToText(a[i]) )

極論、forで回して a[i] > 0の時に関数を実行すれば良いとは思うのですが、Swift的ではないと思います。。。

何か良い方法ござませんかね?


追記

let a:[Int] = [0, 1, 2, 0, 5, 10, 0, 0, 7] という配列がある際に、
1, 2, 4, 5, 8 (a[i] > 0 となる i ) を取得したいです。

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

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

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

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

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

guest

回答2

0

swift

1 2a.filter { $0 > 0 }.forEach(intToText) 3 4// intToText()が値を返し、かつその結果から配列を作りたいのなら 5let b = a.filter { $0 > 0 }.map(intToText) 6

追加

swift

1a.enumerated().filter { $0.element > 0 }.map { $0.offset }.map(intToText)

投稿2017/11/03 12:52

編集2017/11/03 15:05
MasakiHori

総合スコア3391

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

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

退会済みユーザー

退会済みユーザー

2017/11/03 14:03

説明が足りなくてすみません この場合だと、let a:[Int] = [0, 1, 2, 0, 5, 10, 0, 0, 7]で、a.filter { $0 > 0 }.forEach(intToText) とすると、inToTextに渡される変数は、1, 2, 5, 10, 7 ですよね? そうではなくて、この場合だと1, 2, 4, 5, 8 (a[i] > 0 となる i )を欲しいです。
退会済みユーザー

退会済みユーザー

2017/11/05 09:06

返信遅くなりましたがありがとうございます。 enumeratedを用いることでインデックスと要素のタプルを生成できるのですね。 知らなかったのでとても参考になりました。
guest

0

ベストアンサー

Swift 的、むずかしそうなテーマですね。

MasakiHori さんのスタイルもそれらしいと思いますし、または for 文でも where を使った Swift 的な書き方もあるので紹介しておきますね。

やっていることの趣旨は LaserBit さんの "追加" と同じです。せっかくなのでもうひとつの例として、開始インデックスが 0 ではない場合を想定したコードも含めておきます。

swift

1let a = [0, 1, 2, 0, 5, 10, 0, 0, 7] 2 3func intToText(_ int: Int) -> String { 4 5 return String(describing: int) 6} 7 8for (offset, value) in a.enumerated() where value >= 1 { 9 10 // Swift の Array は 0 から始まるインデックスですが、 11 // ここでは 0 から始まるとは限らない ArraySlice も想定して、 12 // 安全のため startIndex から offset 離れた位置を取得している例を紹介します。 13 let index = a.startIndex.advanced(by: offset) 14 15 print(intToText(index)) 16} 17

または、インデックスに注目する場合に indices を使う方法もあるかもしれません。

フィルターの条件で a[$0] と再び a を書かないといけないところが(うっかり間違えそうで)なんとなく不安な気もしますけれど、この書き方ならインデックスに着目していることが明瞭になるのと enumeratedoffsetArray のインデックスが たまたま両方 0 から始まる という事実を使わず、確実に インデックス の値で扱えるため、不確かさが紛れ込まないのは大きな利点に思います。

今回みたいに "Array<Int>" を想定している限りはそこまで配慮は不要ですけれど。

swift

1a.indices 2 .filter { a[$0] >= 1 } 3 .forEach { print(intToText($0)) }

投稿2017/11/04 12:12

編集2017/11/04 12:30
TomohiroKumagai

総合スコア441

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

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

退会済みユーザー

退会済みユーザー

2017/11/05 09:13 編集

返信遅くなりましたがありがとうございます。 こちらのコードの方が可読性が高いかなと思いましたので、ベストアンサーに選ばせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問