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

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

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

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

Swift

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

Q&A

解決済

1回答

758閲覧

Swift5 ネストされたenumのextension

mogiruri

総合スコア37

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/06/05 14:45

こんにちは。

ネストされたenumの扱いについて質問です。
enumでextensionを使用する際、以下のような書き方ができると思います。

swift

1enum ModelError: Error { 2 case invalidLendth 3 case invalidBlank 4 case invalidSessionXML 5 case invalidXMLItem 6} 7 8extension ModelError { 9 var errorText: String { 10 switch self { 11 case .invalidBlank: 12 return "Blank was found" 13 case .invalidLendth: 14 return "Text is too long" 15 case .invalidSessionXML: 16 return "Cannot get XML data" 17 case .invalidXMLItem: 18 return "Cannot found items" 19 } 20 } 21} 22let modelError: ModelError = .invalidBlank 23let text = ModelError.errorText 24print(text) //Blank was found 25

しかし、enumをネストし、そのenumにextensionをかけたところ ”Use of undeclared type~” のエラーが見つかりました。

swift

1enum AlertHandller { 2 enum Success { 3 case setItem 4 case deleteCell 5 } 6 7 enum ErrorInput: Error { 8 case setItem 9 case session 10 } 11} 12 13extension ErrorInput { // ここでエラー 14 var errorText: String { 15 switch self { 16 case .setItem: 17 return "cannot set item" 18 case .session: 19 return "cannot get data" 20 } 21 } 22} 23 24

ロジック自体がちょっと遠回り?な記述という気もしますが、
上記のようにネストされたenumにextensionは書けないのか?という疑問を抱いたので投稿させていただきました。

やりたかったこととしては以下のようなものです。

swift

1let initial = AlertHandller.ErrorInput.setItem 2let text = initial.errorText 3print(text) // cannot set item

今投稿を書いていて自覚したのですがlet text = initial.errorTextのところがちょっと気持ち悪かったです。
おそらく概念的に破綻しているのでしょうか?
わかりそうでわからなかったので、このまま投稿させて頂きます。

よろしくお願いします。

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

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

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

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

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

fuzzball

2019/06/06 00:22

後半、気持ち悪さを具体的に書いて下さい。
mogiruri

2019/06/06 01:52

コメントありがとうございます。 enumをswitchで分岐させる場合、初期化されている値を用いると思いますが(一番上のブロックのコードlet modelError: ModelError = .invalidBlank のようにケースを初期化) ネストenumの場合、親enumである Success と ErrorInput という二つを持ったAlertHandlerが定まっていないため?などと思っていましたが、今一つ一つ丁寧に掘り下げていったら原因がわかりました。 そもそもの let initial = AlertHandller.ErrorInput.setItem をAlertHandller型と思い込んでいましたが、ネストがあるため AlertHandller.ErrorInputまでが型というの正しい表記でした。そのため、書き方は let initial: AlertHandller.ErrorInput = .setItem という風にできます。 そしてextensionの部分ですが、こちらも同様 extension AlertHandller.ErrorInput {} とすることで解決いたしました。 このような書き方をしているソースに私はまだ出会ったことがないのですが、こういう使い方はされるのでしょうか?終着点のcaseまで道のりが長くなるのでどうなのかなと思い、、、
fuzzball

2019/06/06 02:05

道のりが長いとかは関係なくて、ErrorInput が AlertHandller の中にある必要があるかどうか、で決めることではないでしょうか? 個人的には、なぜ AlertHandller が enum なのかが気になりました。
mogiruri

2019/06/06 06:36

上記のコードはいじってしまいましたが自分が製作しているものの中で実装したかったのは、 入力だったり、ネットワークセッションだったりで成功・失敗のアラートを表示させたかったので、上記のようにケースパターンを作成し、extensionの中に var alert : UIAlertController のようなcaseによって違うアラートを返すフローを作りたかったのです。
fuzzball

2019/06/06 07:06

端折ったコードなのであれば、これ以上私が言えることはないです。(っていうほど詳しくないですけどね)繰り返しになりますが、enumのネスト自体は何の問題も無いと思います。
mogiruri

2019/06/07 02:29

コメントありがとうございました。 enumのネストですが、これは一番いいやり方か吟味してから実装するかどうか決めたいと思います!
guest

回答1

0

ベストアンサー

AlertHandller.ErrorInputじゃないですかね。

投稿2019/06/06 00:17

fuzzball

総合スコア16731

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問