いつもお世話になります。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
ソースコードが省略されすぎていて質問者さんが何をしたいのかが分かりません。
実際に何がしたいのかが分かれば何らかの回答をすることが出来るかもしれません。
XY問題であるかもしれません。
https://ja.meta.stackoverflow.com/questions/2701/xy-%E5%95%8F%E9%A1%8C-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B
やりたいことはfor-in文内で最後の要素に到達したことを検知したいということだけです。
countでも、enumurated()でも、最後の要素を比較するでも実現したいことはできているのですが、
もうちょっと簡単に書く方法はないのかなと、
XY問題に近いと思います。
もっと簡単な記述方法があるはずだと自分で思いこんでいるフシがあります。
XY問題と言っているのは「最後の要素に到達したことを検知」する必要がないのではないか?、ということではないでしょうか?
そもそもで言うと`if i === limitedHoges.last {`で十分簡潔だと思うのですがどうなのでしょうか?
コードの例示がわかりづらくて良くなかったです
配列の途中にname == "D"という要素を挟むことによって最後の要素に到達する場合と到達しない場合があると明示すればよかったと思います。
提示のコードであれば検出する必要はなくループを抜けた後で
limitedHoges.last.map { print($0.value) }
とすればいいだけですね。
回答3件
あなたの回答
tips
プレビュー