2016-11-03 3 views

答えて

1

前提条件の:あなたが持っています基になるRawValueの列挙型。すなわち、RawRepresentableに従う列挙体である。


方法Enum.GetName Method (Type, Object)として記載されているC#が、以下:

Enum.GetName Method (Type, Object)

public static string GetName(
    Type enumType, 
    object value 
) 

パラメータ

enumType

  • タイプ:System.Type
  • 列挙型。

    • value

    ジャンル:System.Object
  • 特定の値は、基礎となるタイプの点で一定を列挙しました。

戻り値 - タイプ:System.String - 値valueあるenumTypeで列挙定数の名前を含む文字列。そのような定数がない場合はnull が見つかりました。

スウィフトに「を翻訳した」、この方法は、その第二の一つとして、最初の引数としてenumタイプ、および列挙の基本タイプ値をとります。後者は(RawRepresentable準拠の前提条件のために)スウィフトのタイプの値に変換されます。

最後に、(可能nullリターン付き)戻り値の型System.Stringはスウィフト(String?)ではオプションString戻り値の型に変換します。

func getName<T: RawRepresentable>(_ _: T.Type, rawValue: T.RawValue) -> String? { 
    if let enumCase = T(rawValue: rawValue) { 
     return String(describing: enumCase) 
    } 
    return nil 
} 

/* example setup */ 
enum Rank: Int { 
    case n2 = 2,n3,n4,n5,n6,n7,n8,n9,n10,J,Q,K,A 
} 

/* example usage */ 
let someRawValue = 7 
if let caseName = getName(Rank.self, rawValue: someRawValue) { 
    print(caseName) // n7 
} 

一緒にこれらの観察を編み物、あなたはStringinit(describing:)初期化子とRawRepresentableにblueprinted init?(rawValue:)を組み合わせることにより、(実行時にYourEnum.RawValueインスタンスとして表され、あなたの例String表現を見つけるために)あなたの同様のgetNameメソッドを実装することができ


スウィフトenumは、C#のものとはかなり異なっており、より強力です。 RawValue(例:7)のいずれかではなく、実際にはenumの実際のインスタンスインスタンス(例:Rank.n7)があります。イニシャライザStringをそのままthe answer of @AlexanderMomchliovに記載されているようにそのまま使用できます。

+0

これはC#APIのより直接的なコピーですが、私はSwiftにC#を書くことを奨励するべきではないと思います – Alexander

+0

@AlexanderMomchliov Agreed! – dfri

1

Stringとして列挙ケースの名前を取得するには、Stringinit(describing:)を使用することができます。

enum Foo: Int { 
    case A 
    case B 
    case C 
} 

let s = String(describing: Foo.A) 
print(s) // "A" 

あなたは列挙型にこれを焼くことができます。

enum Foo: Int { 
    case A 
    case B 
    case C 
    var asString: String { return String(describing: self) } 
} 

let s = Foo.A.asString 
print(s) // "A" 
+0

あなたの最初の答えは質問に答えたと思いますが、この編集は答えません。 C#のメソッド 'Enum.GetName(Type、Object)'はenum型と_an object_を使用します。後者の引数は、特定の列挙定数の** value **とその基になる型の点で**です。 "_。現在の答えは、指定された_タイプと大文字小文字の区別(@コンパイル時間の入力)_(例えば、 'Foo.A')のみを使用して印刷します。私はOPが探しているものは、型と 'rawValue'(すなわち、基底型のインスタンス、ここでは' Int'具体的に)を与えられたケースの記述(ランタイム)を出力することです。 – dfri

+0

@dfri私は知っている、それは私を投げている。私はOPが 'rawValue'から' enum'のケースに行きたいと思っていました。しかし、彼自身の答えから、実際には列挙型の場合から 'String'に行くことが分かっていました。 – Alexander

+0

@dfri実際には、私はそれを見て、提供されたC#のセマンティクスに関する私たちの考え方は間違っています。列挙型のケースをStringとして取得します。 – Alexander

関連する問題