2016-09-03 4 views
12

私はCで列挙型を持っており、インデックスはStringで表される必要があります。インデックスによる文字列列挙へのアクセス

整数型インデックスでは、スウィート列挙型の列挙型はどのように使用できますか?

Iは、スイフトに列挙型をコピーしたい文字列にタイプを設定してテキストを表示するために、生の値のすべてを定義し、スウィフト文字列列挙のための生の値のテキストを抽出するC列挙値を使用します。

それ以外の場合は、文字列の配列を作成します。しかし、列挙型を使用する方が便利です。

答えて

22

スウィフトでは、列挙型にはインデックスの情報が保持されません(少なくとも、プログラマには提供されません)。

ので:

は、どのように、String型のスウィフト列挙型は、整数インデックスで使用することができますか?

答えは「できません」です。


あなたのバウンドの文字列と同じことができるならば、例えば、...

をあなたがInt(または列挙型の場合)を結合することができ、以外の多くの方法でString値は、ちょうど文字列の配列を作成しますあなたの文字列がテキストを表示する少し複雑にする必要がある場合、あなたは私たちすることができ

enum MyEnum: Int { 
    case foo 
    case bar 
    case baz 

    var string: String { 
     return String(self) 
    } 
} 

if let value = MyEnum(rawValue: 0) { 
    print(value.string) //->foo 
} 

:caseラベルは、あなたがこのような何かを書くことができますe Swift Dictionaryは、列挙型のケースと文字列をバインドします。

enum AnotherEnum: Int { 
    case foo 
    case bar 
    case baz 

    static let mapper: [AnotherEnum: String] = [ 
     .foo: "FooString", 
     .bar: "BarString", 
     .baz: "BazString" 
    ] 
    var string: String { 
     return AnotherEnum.mapper[self]! 
    } 
} 

if let value = AnotherEnum(rawValue: 1) { 
    print(value.string) //->BarString 
} 

もう少し読みやすい文字列の簡単な配列より。

+0

非常に良い、ありがとう:) – jarryd

4

簡単な回避策は、文字列列挙型を列挙する場合にも便利です。

enum MyEnum: String { 
    case foo = "fooString" 
    case bar = "barString" 
    case baz = "bazString" 

    static let allValues = [foo, bar, baz] //must maintain second copy of values 
} 

//enumeration advantage 
for value in MyEnum.allValues { 
    print(value) 
} 

//get value by index 
let value = MyEnum.allValues[1] 

print(value) //barString 
+0

まったく素晴らしい、ありがとう。私はこれが言語そのものになると思う。もちろん、同じものにアクセスするための既存の方法論がない限り。 –

関連する問題