var titleArray = ["朝", "昼", "夜"] titleArray.forEach{ print($0) //朝 昼 夜 }
forEachで取得した要素($0 朝 昼 夜)をスコープ外で使用したいのですが、うまくいきません。
【試したこと】
var titleArray = ["朝", "昼", "夜"] var title:String? titleArray.forEach{title = $0} print(title!) // 夜
変数を用意してスコープ内で代入したのですが、配列の末尾しか入りません。
初歩的な質問ですが、よろしくお願いいたします。
直接的な回答ではないのでこちらに記載します。
そもそも「試したこと」にあるソースを日本語に読み直すと
①titleArray分ループ
①-①titleにtitleArrayから取り出した1行を代入
②titleをprint
ですので、titleArrayの最後の要素が最終的に代入されて"夜"と出力される。
というのは理解しておりますでしょうか?
それと、printメソッドを複数回使用するためのループですので
スコープ外で行いたい理由がわかりません。
結局はループないし代用のメソッドを使用して出力する事になると思います。
titleにtitleArrayのコピーを作りたいわけではないのですよね?
回答ありがとうございます。
titleArrayの最後の要素が最終的に代入されて"夜"と出力される。
というのは理解しておりますでしょうか?
→こちらは理解できました
printメソッドを複数回使用するためのループですので
スコープ外で行いたい理由がわかりません。
結局はループないし代用のメソッドを使用して出力する事になると思います。
titleにtitleArrayのコピーを作りたいわけではないのですよね?
→ titleArrayから 朝 昼 夜 を一つずつ取得して、外部で使いたいのが目的で
for in か forEachしか方法がわからずこのような形になってしまいました。
firebaseから取得したデータの配列の中身を取得したかったのですが
そもそもの方法が違うのでしょうか・・・
https://teratail.com/questions/349351
知識不足で申し訳ございません。
>→ titleArrayから 朝 昼 夜 を一つずつ取得して、外部で使いたいのが目的で
for in か forEachしか方法がわからずこのような形になってしまいました。
その「外部で使いたい」というのは「スコープ外で使いたい」ということだと思うのですが、
そもそも「titleArrayから 朝 昼 夜 を一つずつ取得して」を行うという手法のために
ループが存在するのです。そこは理解されてますでしょうか?
はい、理解しております。
では、ループで使用すればよいと思いますが、
ループのスコープ外で使用したい意図はどのようなものでしょうか?
それが可能かどうかというご質問でしょうか?
もしくは何か別の意図があってのことでしょうか?
別の意図なら提示していただければ、解決策が見つかるかもしれません。
別で同様のご質問をされているようですが、
そちらの質問内容とこちらの質問内容の意図は同義でしょうか?
別の質問には「for in を使用してもtitleArrayの中身を保持したい」と書いてありますが、
こちらの質問も同様に、「forEachを使用するとtitleArrayの中身が保持されないから
保持されるようにしたい」という事でしょうか?
ループのスコープ外で使用したい意図はどのようなものでしょうか?
それが可能かどうかというご質問でしょうか?
→取得した文字をTableViewのセルに反映したいため、スコープ外で使用したいと考えていました。
「forEachを使用するとtitleArrayの中身が保持されないから
保持されるようにしたい」という事でしょうか?
→はい、その認識でいます。
titleArrayが普通の配列ではなくラッパーされたクラスになっているわけではないのでしょうか?
forEach等のループで参照されると、中身のインデックスが更新されて、中身は入っているけど最後のインデックスから参照されるクラス。のような。
まずtitleArrayをtype ofしてみてください。
それと、Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか?
swiftをしばらく触っていなかったため確証はないですが、普通に配列ループするだけでは中身はなくならないと思います。
まずtitleArrayをtype ofしてみてください。
→この結果、Array<String>と表示されました
Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか?
→中身の変更はありませんでした。
やはり、前にもおっしゃっていた通りスコープ内でループを使う方法で考えた方がよいでしょうか。
Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか?
→中身の変更はありませんでした。
上記を見るに、中身が空になっている訳ではないようですね。
こちらは関係ないでしょうか?
https://teratail.com/questions/196666
もしくはこちら
https://qiita.com/koher/items/2a1a364de98845ac6963
ありがとうございます。
二つ目の記事を参考に、できそうな気がします。
ご教授ありがとうございました!
回答2件
あなたの回答
tips
プレビュー