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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1793閲覧

別クラスからのAlertの呼び出し

Narikura

総合スコア6

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/10/28 04:37

編集2020/10/28 06:07

前提・実現したいこと

ViewControllerとは別に新たにAlertファイルを作成し、そこに用途に応じてtitleとmessageを場合わけをしたものと、Alertの定義文を記述します。
アラートを表示させたいViewControllerや他のファイルでenumで分岐したアラート文を呼び出します。

発生している問題・エラーメッセージ

まだまだ、型についての知識が浅く、型があっていないからでしょうか以下のようなエラーが表示されます。

Instance member 'message' cannot be used on type 'Alert.ErrorType'; did you mean to use a value of this type instead?

該当のソースコード

Alert

1import Foundation 2import UIKit 3 4class Alert: UIAlertController { 5 enum ErrorType: String { 6 case failedLoadUrl 7 case failedFetchAPI 8 9 func title() -> String { 10 switch self { 11 case .failedLoadUrl: 12 return "Webページの取得に失敗しました" 13 case .failedFetchAPI: 14 return "タイトルの取得に失敗しました" 15 } 16 } 17 18 func message() -> String { 19 switch self { 20 case .failedLoadUrl: 21 return "もう一度やり直してください" 22 case .failedFetchAPI: 23 return "アプリを再起動し、もう一度やり直してください" 24 } 25 } 26 } 27 28 static func show(viewController: UIViewController) { 29 let alert: UIAlertController = UIAlertController(title: ErrorType.title(), message: ErrorType.message(), preferredStyle: .alert) 30 viewController.present(alert, animated: true, completion: nil) 31 let actionCancel = UIAlertAction(title: "OK", style: .cancel) { 32 action in print("Pushed CANCEL!") 33 } 34 alert.addAction(actionCancel) 35 } 36}

ViewController

1 Alert.show(title: .failedFetchAPI, message: .failedFetchAPI, viewController: self)

試したこと

型をStringに統一するため調べてみましたがいまいちこれといった解決にいたりませんでした。
enumからfilterを使う方法は調べました。

補足情報(FW/ツールのバージョンなど)

少し説明が不十分かもしれませんがご教授お願いいたします。

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

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

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

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

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

TsukubaDepot

2020/10/28 09:36

定義側は static func show(viewController: UIViewController) { となっていますが、呼び出し側は Alert.show(title: .failedFetchAPI, message: .failedFetchAPI, viewController: self) と引数の個数も型も全く一致していません。 この辺りをまず修正していただけないでしょうか。
Narikura

2020/10/28 10:25

引数が全く一致しておりませんでした。enumの引数を定義したことで解決しました。ご指摘ありがとうございました。
TsukubaDepot

2020/10/28 12:00

完全に解決されたのでしょうか。 そうであれば自己解決でお願いいたします。
guest

回答1

0

ベストアンサー

2点修正が必要な箇所がありました。

①. メソッドを呼び出している箇所の引数が合ってない。
メソッドの定義が

static func show(viewController: UIViewController) {}

となっているので、ViewControllerクラスでの呼び出しは以下のようになると思います。

Alert.show(viewController: self)

②. Enumメソッドの呼び出し
ErrorType.title()ErrorType.message()の箇所ですが、
Enum型に対してではなく、caseに対してメソッド呼び出さなくてはなりません。

修正方法は色々考えられるのですが、例えば以下のように、ErrorTypeのcaseを引数で渡せるようにして、その引数に対してtitle()message()を実行するように変更します。

static func show(errorType: Alert.ErrorType, viewController: UIViewController) { let alert: UIAlertController = UIAlertController(title: errorType.title(), message: errorType.message(), preferredStyle: .alert) viewController.present(alert, animated: true, completion: nil) let actionCancel = UIAlertAction(title: "OK", style: .cancel) { action in print("Pushed CANCEL!") } alert.addAction(actionCancel) }

なので、最終的にViewControllerクラスでの呼び出しは以下のようになります。

ViewController

1let errorType: Alert.ErrorType = .failedFetchAPI 2Alert.show(errorType: errorType, viewController: self)

投稿2020/10/31 11:56

ichi888

総合スコア81

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問