[解決済み] カスタムイニシャライザを持つSwift enumはrawValueイニシャライザを失う
質問
私はこの問題を最も単純な形に煮詰めるために、次のようにしました。
セットアップ
Xcode バージョン 6.1.1 (6A2008a)
で定義されたenumは
MyEnum.swift
:
internal enum MyEnum: Int {
case Zero = 0, One, Two
}
extension MyEnum {
init?(string: String) {
switch string.lowercaseString {
case "zero": self = .Zero
case "one": self = .One
case "two": self = .Two
default: return nil
}
}
}
と、別のファイルでenumを初期化するコード。
MyClass.swift
:
internal class MyClass {
let foo = MyEnum(rawValue: 0) // Error
let fooStr = MyEnum(string: "zero")
func testFunc() {
let bar = MyEnum(rawValue: 1) // Error
let barStr = MyEnum(string: "one")
}
}
エラー
を初期化しようとすると、Xcodeは次のようなエラーを出します。
MyEnum
をその生の値のイニシャライザーで初期化しようとすると、次のようなエラーが発生します。
Cannot convert the expression's type '(rawValue: IntegerLiteralConvertible)' to type 'MyEnum?'
注意事項
-
1 つにつき Swift言語ガイド :
生の値の型を持つ列挙型を定義すると、列挙型は自動的に生の値の型の値を取るイニシャライザーを受け取ります (このパラメータは
rawValue
というパラメータ) を取り、列挙型のメンバまたはnil
. -
のカスタムイニシャライザは
MyEnum
は、以下のようなケースから、enum の raw-value イニシャライザが削除されているかどうかをテストするために拡張モジュールで定義されました。 言語ガイドの . しかし、それは同じエラーの結果を達成します。値型にカスタムイニシャライザを定義すると、その型のデフォルトイニシャライザ(構造体の場合はメンバイニシャライザ)にはアクセスできなくなることに注意してください。[...]
デフォルトのイニシャライザーとメンバ単位のイニシャライザー、および独自のイニシャライザーで初期化できるようにしたい場合は、値型の元の実装の一部としてではなく、拡張機能でカスタムのイニシャライザーを記述してください。 -
enumの定義を
MyClass.swift
のエラーは解決されます。bar
に対するエラーは解決されますがfoo
. -
カスタムイニシャライザーを削除すると、両方のエラーが解決されます。
-
1 つの回避策は、enum の定義に次の関数を含め、提供された raw-value のイニシャライザの代わりにそれを使用することです。つまり、カスタムのイニシャライザーを追加すると、生の値のイニシャライザーをマークするのと同様の効果があるように思えます。
private
.init?(raw: Int) { self.init(rawValue: raw) }
-
プロトコルの適合性を明示的に宣言し
RawRepresentable
でMyClass.swift
のインラインエラーは解決されます。bar
を解決しますが、重複シンボルに関するリンカーエラーが発生します (生の値型の列挙は暗黙のうちにRawRepresentable
).extension MyEnum: RawRepresentable {}
ここで何が起こっているのか、誰かもう少し洞察を与えてくれませんか?なぜraw-valueイニシャライザーはアクセスできないのでしょうか?
どのように解決するのですか?
このバグは、Xcode 7とSwift 2で解決されます。
関連
-
[解決済み] Swiftでindexとelementでループを反復させる方法
-
[解決済み] String型のenumを列挙する方法は?
-
[解決済み] Swiftダブルからストリング
-
[解決済み] Protocol ... can only be used as generic constraint because it has Self or associated type requirements "とは、どういう意味ですか?
-
[解決済み] Swift 3でカスタム通知を作成するには?
-
[解決済み] 非'@objc'メソッドは'@objc'プロトコルのオプション要件を満たしていない
-
[解決済み] swiftにおける "precondition "と "assert "の違いとは?
-
[解決済み] アニメーションによる円の描画
-
[解決済み] Swiftでenumの関連値を無視して比較する方法は?
-
[解決済み] Swiftでクラスメソッド/プロパティを作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] すべてのenumの値を配列として取得する方法
-
[解決済み] Swift 3でカスタム通知を作成するには?
-
[解決済み] Swiftで警告を消すには?
-
[解決済み] 非'@objc'メソッドは'@objc'プロトコルのオプション要件を満たしていない
-
[解決済み] Swift: インデックスで文字列配列を置換する
-
[解決済み] Swift で UIViewController のサブクラス用のカスタムイニシャライザを作るには?
-
[解決済み] ボタンを無効化する
-
[解決済み] Xcode 8.3 betaの「String interpolation produces a debug description for an optional value; did you mean to make this explicit?
-
[解決済み] Swift: switch ケースでオプションの値に対するテストを行う
-
[解決済み] swift で文字列から数字以外の文字を削除する