こんにちは。
ネストされた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
のところがちょっと気持ち悪かったです。
おそらく概念的に破綻しているのでしょうか?
わかりそうでわからなかったので、このまま投稿させて頂きます。
よろしくお願いします。
後半、気持ち悪さを具体的に書いて下さい。
コメントありがとうございます。
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まで道のりが長くなるのでどうなのかなと思い、、、
道のりが長いとかは関係なくて、ErrorInput が AlertHandller の中にある必要があるかどうか、で決めることではないでしょうか?
個人的には、なぜ AlertHandller が enum なのかが気になりました。
上記のコードはいじってしまいましたが自分が製作しているものの中で実装したかったのは、
入力だったり、ネットワークセッションだったりで成功・失敗のアラートを表示させたかったので、上記のようにケースパターンを作成し、extensionの中に var alert : UIAlertController のようなcaseによって違うアラートを返すフローを作りたかったのです。
端折ったコードなのであれば、これ以上私が言えることはないです。(っていうほど詳しくないですけどね)繰り返しになりますが、enumのネスト自体は何の問題も無いと思います。
コメントありがとうございました。
enumのネストですが、これは一番いいやり方か吟味してから実装するかどうか決めたいと思います!
回答1件
あなたの回答
tips
プレビュー