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

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

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

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

Q&A

解決済

3回答

2833閲覧

for-in文内で最後の要素に到達した場合を簡潔に表現する方法を教えて下さい。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2020/05/13 03:27

編集2020/05/14 01:12

いつもお世話になります。for-in文内で最後の要素に到達した場合を簡潔に表現する方法をご存知でしたら教えて下さい。

コードが適切でなかったため、訂正します
これでも適切かどうかわかりませんが…。

swift

1 2enum Type { 3 case A 4 case B 5 case C 6 case D 7} 8 9class Hoge { 10 11 var name: String 12 var type: Type 13 var value: Int 14 15 init(name: String, type: Type, value: Int = 1) { 16 self.name = name 17 self.type = type 18 self.value = value 19 } 20 21} 22 23 24var hoges = [Hoge]() 25 26for i in hoges { 27 28 if i.type == .C { 29 // Cが見つかったときの処理 30 break 31 } 32 33 if i.type == .D { 34 // Dが見つかったときの処理 35 break 36 } 37 38 // 最後の要素に到達したらという表現を簡潔に書きたいです 39 if i === hoges.last { 40 // 最後に到達した場合という表現が要素を比較する方法以外でありますか? 41 } 42 43} 44 45

訂正前コード

swift

1class Hoge { 2 3 var name: String 4 var value: Int 5 6 init(_ name: String, value: Int = 1) { 7 self.name = name 8 self.value = value 9 } 10 11} 12 13 14let hoges = [Hoge("A"), Hoge("B"), Hoge("A"), Hoge("A"), Hoge("A"), Hoge("A"), Hoge("C", value: 2), Hoge("A")] 15 16let limitedHoges = hoges[hoges.firstIndex(where: { $0.name == "B" })!...hoges.firstIndex(where: { $0.name == "C" })!] 17 18 19for i in limitedHoges { 20 21 if i.name == "D" { 22 print(i.value) 23 break 24 } 25 26 // 最後の要素に到達したらという表現を簡潔に書きたいです 27 if i === limitedHoges.last { 28 print(i.value) 29 } 30 31} 32 33// => 2 34

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/05/13 07:53

やりたいことはfor-in文内で最後の要素に到達したことを検知したいということだけです。 countでも、enumurated()でも、最後の要素を比較するでも実現したいことはできているのですが、 もうちょっと簡単に書く方法はないのかなと、 XY問題に近いと思います。 もっと簡単な記述方法があるはずだと自分で思いこんでいるフシがあります。
gingertail

2020/05/13 08:39

XY問題と言っているのは「最後の要素に到達したことを検知」する必要がないのではないか?、ということではないでしょうか? そもそもで言うと`if i === limitedHoges.last {`で十分簡潔だと思うのですがどうなのでしょうか?
退会済みユーザー

退会済みユーザー

2020/05/13 09:02 編集

コードの例示がわかりづらくて良くなかったです 配列の途中にname == "D"という要素を挟むことによって最後の要素に到達する場合と到達しない場合があると明示すればよかったと思います。
MasakiHori

2020/05/14 00:26

提示のコードであれば検出する必要はなくループを抜けた後で limitedHoges.last.map { print($0.value) } とすればいいだけですね。
guest

回答3

0

swift

1let hoge = limitedHoges.first(where: {$0.name == "D"}) ?? limitedHoges.last! 2print(hoge.name, hoge.value)

質問のコードであればこれで大丈夫?
Dがあればその要素を表示、無ければ最後の要素を表示しています。

投稿2020/05/13 08:40

gingertail

総合スコア317

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

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

退会済みユーザー

退会済みユーザー

2020/05/16 08:18

せっかかく回答頂いたのですが、 質問文のコードが適切ではありませんでした。 すいませんでした。
guest

0

単純に最後の要素に処理を追加するだけなら、ループの外に出してしまうのが簡単だと思います。

Swift

1for i in limitedHoges { 2 // すべての要素に対して行う処理 3} 4if let i = limitedHoges.last { 5 // 最後の要素に追加する処理 6}

最後の要素とそれ以外で別の処理を行う場合も、

Swift

1for i in limitedHoges.dropLast() { 2 // 最後の要素以外に行う処理 3} 4if let i = limitedHoges.last { 5 // 最後の要素だけに行うの処理 6}

でできると思います。

投稿2020/05/13 07:34

AOKINAO

総合スコア268

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

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

退会済みユーザー

退会済みユーザー

2020/05/13 07:38

回答ありがとうございます。 breakなんで外に出すのはちょっと。
guest

0

ベストアンサー

要素数をカウントする変数(count)を用意するのはどうでしょうか?

swift

1var count = 0 2for i in limitedHoges { 3 count += 1 4 if count == limitedHoges.count { 5 print("最後の要素に到達") 6 } 7}

enumeratedを使う方法もあります

swift

1for (i, value) in limitedHoges.enumerated() { 2 if i == limitedHoges.count - 1 { 3 print("最後の要素に到達") 4 } 5}

投稿2020/05/13 05:55

soo

総合スコア80

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

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

退会済みユーザー

退会済みユーザー

2020/05/13 06:20

回答ありがとうございます。i.offset/i.elementですね。
退会済みユーザー

退会済みユーザー

2020/05/16 08:19

要素で比較するか、要素で比較できないときはindexで判断するしかないようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問