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

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

新規登録して質問してみよう
ただいま回答率
86.12%
非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

解決済

Swift クロージャによる画面遷移と値の渡し方について

nyansuke373
nyansuke373

総合スコア7

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

2回答

0リアクション

0クリップ

2003閲覧

投稿2020/05/08 01:27

昨日、ここの優秀な方に見てもらったのですが、私の理解が及ばず解決に至っていない問題について質問を立て直しました。お力を借りることはできますでしょうか?
【過去質問】 https://teratail.com/questions/259406
【今やっている事】
ふりがな変換APIを利用したアプリ開発
【どうやっているか】
ViewController(入力後HttpRequestを呼んでいます)→HttpRequest(API取得)→ResultViewController(結果表示)を考えています。
【解決したい事】
下記コードで実行してもAlamofire.requestのところでその中の処理が流れずに、segueを使って値渡しをしてしまうため、結果が表示されるResultViewControllerにnilが渡されてしまいエラーが起こってしまう
【期待値】
Alamofire.requestの処理が通ってからResultViewControllerに値を渡してresultTextViewに表示すること

不明な点などがあれば、追記いたします。よろしくお願いいたします。

Swift

import UIKit import Alamofire import SwiftyJSON class ViewController: UIViewController,UITextFieldDelegate { @IBOutlet weak var inputTextView: UITextField! // APIRequestの初期化 var apiRequest = APIRequest() override func viewDidLoad() { super.viewDidLoad() inputTextView.delegate = self initInputText() } private func initInputText() { inputTextView.text = "" } @IBAction func convertButton(_ sender: UIButton) { //キーボードを閉じる view.endEditing(true) // リクエストを渡す時にクロージャも渡し、その内部で書き換えの処理を行う // クロージャの処理は completion: の後の {} の中 apiRequest.HttpRequest(sentence: inputTextView.text!, completion: { result in // navigationController を使った画面遷移は、performSegue もしくは instantinateViewController と pushViewController を組み合わせて使う // segue を使う画面遷移 self.performSegue(withIdentifier: "nextSegue", sender: result) }) } // segue を使って値渡しする場合 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 遷移先が ResultViewController の場合 if let nextVC = segue.destination as? ResultViewController { // sender が String としてダウンキャストできる場合 if let result = sender as? String { // 遷移先のプロパティに値をセットする nextVC.result = result } } } } public class APIRequest { // 関数の引数としてクロージャを取るように設定し、クロージャ内部で目的とするビューに表示させる // クロージャは completion: の後に引数として取る // func HttpRequest(sentence: String) { func HttpRequest(sentence: String, completion: @escaping (String) -> Void ) { let url = URL(string: "https://labs.goo.ne.jp/api/hiragana")! let parameters = ["app_id":"適切なAPIキー https://labs.goo.ne.jp/api/jp/hiragana-translation/ で発行後、入力してください", "sentence":"(sentence)", "output_type":"hiragana"]    //AlamofireでHTTPリクエスト Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON { response in        //↓ここに処理が流れない switch response.result { // 処理成功時 case .success(let data): if let result = data as? [String: Any] { //SwiftyJSONを使用してJSON解析 let json = JSON(result as Any) let resultString = json["converted"].string // MARK: 変更 // ResultVC.showResult(resultString: resultString!) // 上記の方法でビューをインスタンス化しても表示することはできない。 // インスタンス化する方法はクロージャで渡された処理に任せる if let resultString = resultString { // クロージャで渡された処理がメインキューで行うべき処理かもしれないので、メインキューで処理する DispatchQueue.main.async { // クロージャの処理 completion(resultString) } } } // 処理失敗時 case .failure(let error): print("error: ", error.localizedDescription) } } } } class ResultViewController: UIViewController, UITextFieldDelegate { // MARK: 追加 // 前の画面から渡される変数 var result: String! @IBOutlet weak var resultTextView: UITextField! override func viewDidLoad() { super.viewDidLoad() resultTextView.delegate = self // ここで showResult を実行する 現在ここにnilが渡ってきてしまっています。 showResult(resultString: result) } func showResult(resultString: String) { resultTextView?.text = resultString print(resultString) } }

ViewController(入力後HttpRequestを呼んでいます)→HttpRequest(裏でAPI取得)→ResultViewController(結果表示)
ストーリーボード

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Swift

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

クロージャ

クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。