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

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

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

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

Q&A

解決済

2回答

2237閲覧

forEachで取得した値をスコープ外で使用したい

taro-ken

総合スコア0

Swift

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

0グッド

1クリップ

投稿2021/07/16 14:00

var titleArray = ["朝", "昼", "夜"] titleArray.forEach{ print($0) //朝 昼 夜 }

forEachで取得した要素($0  朝 昼 夜)をスコープ外で使用したいのですが、うまくいきません。

【試したこと】

var titleArray = ["朝", "昼", "夜"] var title:String? titleArray.forEach{title = $0} print(title!) // 夜

変数を用意してスコープ内で代入したのですが、配列の末尾しか入りません。

初歩的な質問ですが、よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/07/16 14:28

直接的な回答ではないのでこちらに記載します。 そもそも「試したこと」にあるソースを日本語に読み直すと ①titleArray分ループ  ①-①titleにtitleArrayから取り出した1行を代入 ②titleをprint ですので、titleArrayの最後の要素が最終的に代入されて"夜"と出力される。 というのは理解しておりますでしょうか? それと、printメソッドを複数回使用するためのループですので スコープ外で行いたい理由がわかりません。 結局はループないし代用のメソッドを使用して出力する事になると思います。 titleにtitleArrayのコピーを作りたいわけではないのですよね?
taro-ken

2021/07/17 03:03

回答ありがとうございます。 titleArrayの最後の要素が最終的に代入されて"夜"と出力される。 というのは理解しておりますでしょうか? →こちらは理解できました printメソッドを複数回使用するためのループですので スコープ外で行いたい理由がわかりません。 結局はループないし代用のメソッドを使用して出力する事になると思います。 titleにtitleArrayのコピーを作りたいわけではないのですよね? → titleArrayから 朝 昼  夜 を一つずつ取得して、外部で使いたいのが目的で for in か forEachしか方法がわからずこのような形になってしまいました。 firebaseから取得したデータの配列の中身を取得したかったのですが そもそもの方法が違うのでしょうか・・・ https://teratail.com/questions/349351 知識不足で申し訳ございません。
退会済みユーザー

退会済みユーザー

2021/07/17 03:16

>→ titleArrayから 朝 昼  夜 を一つずつ取得して、外部で使いたいのが目的で for in か forEachしか方法がわからずこのような形になってしまいました。 その「外部で使いたい」というのは「スコープ外で使いたい」ということだと思うのですが、 そもそも「titleArrayから 朝 昼  夜 を一つずつ取得して」を行うという手法のために ループが存在するのです。そこは理解されてますでしょうか?
taro-ken

2021/07/17 05:04

はい、理解しております。
退会済みユーザー

退会済みユーザー

2021/07/17 13:37

では、ループで使用すればよいと思いますが、 ループのスコープ外で使用したい意図はどのようなものでしょうか? それが可能かどうかというご質問でしょうか? もしくは何か別の意図があってのことでしょうか? 別の意図なら提示していただければ、解決策が見つかるかもしれません。
退会済みユーザー

退会済みユーザー

2021/07/17 20:47

別で同様のご質問をされているようですが、 そちらの質問内容とこちらの質問内容の意図は同義でしょうか? 別の質問には「for in を使用してもtitleArrayの中身を保持したい」と書いてありますが、 こちらの質問も同様に、「forEachを使用するとtitleArrayの中身が保持されないから 保持されるようにしたい」という事でしょうか?
taro-ken

2021/07/18 23:44

ループのスコープ外で使用したい意図はどのようなものでしょうか? それが可能かどうかというご質問でしょうか? →取得した文字をTableViewのセルに反映したいため、スコープ外で使用したいと考えていました。 「forEachを使用するとtitleArrayの中身が保持されないから 保持されるようにしたい」という事でしょうか? →はい、その認識でいます。
退会済みユーザー

退会済みユーザー

2021/07/19 00:02

titleArrayが普通の配列ではなくラッパーされたクラスになっているわけではないのでしょうか? forEach等のループで参照されると、中身のインデックスが更新されて、中身は入っているけど最後のインデックスから参照されるクラス。のような。 まずtitleArrayをtype ofしてみてください。 それと、Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか? swiftをしばらく触っていなかったため確証はないですが、普通に配列ループするだけでは中身はなくならないと思います。
taro-ken

2021/07/19 12:24

まずtitleArrayをtype ofしてみてください。 →この結果、Array<String>と表示されました Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか? →中身の変更はありませんでした。 やはり、前にもおっしゃっていた通りスコープ内でループを使う方法で考えた方がよいでしょうか。
taro-ken

2021/07/21 10:35

ありがとうございます。 二つ目の記事を参考に、できそうな気がします。 ご教授ありがとうございました!
guest

回答2

0

自己解決

Array.countをtitleArrayループ前と後で確認してみてはいかがでしょうか?
→中身の変更はありませんでした。

上記を見るに、中身が空になっている訳ではないようですね。

こちらは関係ないでしょうか?
https://teratail.com/questions/196666

もしくはこちら
https://qiita.com/koher/items/2a1a364de98845ac6963

こちらで解決しました。

投稿2021/07/21 10:36

taro-ken

総合スコア0

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

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

0

他の質問を見ての、何となくの勘ですが、

let titleArray = ["朝", "昼", "夜"] let title = titleArray.joined(separator: ",") print(title)

こうでしょうか?

投稿2021/07/16 23:04

tanakana

総合スコア150

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

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

taro-ken

2021/07/17 03:09

回答ありがとうございます。 その方法は試したのですが、一文字ずつ取得したいので望んだ結果にはなりませんでした…
tanakana

2021/07/18 05:11

一文字ずつとは配列の要素の事ですか? var title:String? は一つの要素しか入らないので 直接 titleArray[0] titleArray[1] titleArray[2] として所得するしかないのではないでしょうか。 何にどう使うのかが書かれてないのでなんとも言えませんが・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問