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

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

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

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

Q&A

解決済

2回答

1643閲覧

Swift TabBar 値渡しについて

退会済みユーザー

退会済みユーザー

総合スコア0

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Swift

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

0グッド

1クリップ

投稿2020/05/13 17:46

お世話になっております。現在、TabBarを使った値渡しを実装したいと考えております。
調べていたところ、下記記事を見つけました。
https://teratail.com/questions/117523

実装したい処理がほとんど同じなので、参考にしたいのですが、

import UIKit class ViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() if let nc = self.viewControllers?[0] as? UINavigationController, let vc = nc.viewControllers[0] as? FirstViewController {        vc.delegate = self } } } // FirstViewControllerの保存ボタンアクションを受け取る extension ViewController: FirstDelegate { func saveButtonTapped(text: String) { if let nc = self.viewControllers?[1] as? UINavigationController, let vc = nc.viewControllers[0] as? SecondViewController { vc.savedString = text self.selectedIndex = 1 } } }

にある、

if let nc = self.viewControllers?[0] as? UINavigationController, let vc = nc.viewControllers[0] as? FirstViewController{...
if let nc = self.viewControllers?[1] as? UINavigationController, let vc = nc.viewControllers[0] as? SecondViewController...

というのはどのような意味をしているのでしょうか?
if let はnilを防ぐもの?、as? はダウンキャスト?かと思っていますが、一連の内容がわかりません。
どうかよろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず if let 変数 = nilかも知れない式 { ... } という書き方は、「nilかも知れない式」を評価して、その値が nil でない場合に、それを変数に代入して if のボディを実行します。これは Swift の nil 安全性の一環で、例えば vc が nil かもしれない場合に vc のメソッドを呼び出すとクラッシュしてしまうので、それを防ぐために場合分けするものです。
参考: Swiftのオプショナル型の使いこなし | Think IT(シンクイット)

次に as? は安全なキャストです。UINavigationController は UIViewController の一種なので、UINavigationController はそのまま UIViewController 型の変数に代入できますが、UIViewController 型の変数に入ってるものは UINavigationController とは限らないので、キャストに失敗する可能性があります。as? を使ってキャストする場合、失敗すると nil になるので、if let などと合わせて安全にキャストを行うことができます。
参考: 型のキャスト (as, as?, as!) について - Qiita

で、コードの意味ですが、self.viewControllers というのは TabView の各タブに割り当てられた画面のことで、それが UINavigationController で、かつその UINavigationController の最初の画面が FirstViewController であることを確認して、その場合にのみ処理を行うというコードになります。
おそらく Main.storyboard でそのように作ってあるんだと思いますが、Swift コード側からは storyboard の内容は保証できないし、誰かが間違って storyboard を書き換えてしまう可能性もあるので、このような確認を含むコードが必要になります。

swift

1 if let nc = self.viewControllers?[0] as? UINavigationController, 2 let vc = nc.viewControllers[0] as? FirstViewController { 3 4       vc.delegate = self 5 }

(もっとも、storyboard の内容がおかしい場合など、アプリは期待通り動かないので、as! を積極的に使って早めにクラッシュさせた方がいい、という考え方もあります。)
参考: SwiftのOptionalのベストプラクティス - Qiita
.

投稿2020/05/13 21:25

編集2020/05/14 03:17
hoshi-takanori

総合スコア7895

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

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

hoshi-takanori

2020/05/14 03:14

あれ? なぜか空の回答が…。失礼しました。
退会済みユーザー

退会済みユーザー

2020/05/14 14:45

ご丁寧にわかりやすい参考URLまでありがとうございます。今まで理解しづらかった部分、掴めそうです。また、今回の件で一つ疑問がございます。 今回のように、NavigationControllerとTabBarControllerがある状態で、タブ間で値の受け渡しをしたい場合は、今回例として提示させていただいた記事のように、デリゲートを使って行うしかないのでしょうか? 試しに、デリゲートを使わずに、FirstViewControllerにおいたボタンをクリックしてSecondViewControllerにあるtableviewに表示させるというコードを書いてみたのですが、うまくいきませんでした(NavigationControllerは使わずに、TabBarControllerだけの状態では成功しました...)
hoshi-takanori

2020/05/14 15:05

ListView で選択されたものを詳細画面で表示するような関連の深いデータの場合は画面間で直接データを受け渡すのが望ましいのですが、タブ間のデータの共有にはシングルトンを使うのが一般的だと思います。 https://qiita.com/mcz9mm/items/a58ba981f1b90d5d7ede
退会済みユーザー

退会済みユーザー

2020/05/14 15:19

ありがとうございます! そうなんですね。シングルトンこれを機にやってみます。 色々とありがとうございました!
guest

0

次のサイトがあっているのではないでしょうか。

TabBarでコードからページ遷移をしてデータを渡す方法

投稿2020/05/14 00:47

freemann

総合スコア264

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

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

退会済みユーザー

退会済みユーザー

2020/05/14 15:19

ありがとうございます!参考にさせていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問