はSwiftにEnum.GetName(Type、Object)メソッドの代替がいくつか存在しますか? C#で
Enum.GetName (Type, Object)
スウィフトで同じことを行うことは可能であるがこの方法で任意の型の列挙型の名前を取得することは可能でしょうか?
例として、int生の価値が必要ないくつかの列挙型がありますが、それに自分の名前が必要です。 Swift 3でこれを行う方法は?
はSwiftにEnum.GetName(Type、Object)メソッドの代替がいくつか存在しますか? C#で
Enum.GetName (Type, Object)
スウィフトで同じことを行うことは可能であるがこの方法で任意の型の列挙型の名前を取得することは可能でしょうか?
例として、int生の価値が必要ないくつかの列挙型がありますが、それに自分の名前が必要です。 Swift 3でこれを行う方法は?
前提条件の:あなたが持っています基になる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
}
: 一緒にこれらの観察を編み物、あなたはString
のinit(describing:)
初期化子とRawRepresentable
にblueprinted init?(rawValue:)
を組み合わせることにより、(実行時にYourEnum.RawValue
インスタンスとして表され、あなたの例String
表現を見つけるために)あなたの同様のgetName
メソッドを実装することができ
スウィフトenum
は、C#のものとはかなり異なっており、より強力です。 RawValue
(例:7
)のいずれかではなく、実際にはenumの実際のインスタンスインスタンス(例:Rank.n7
)があります。イニシャライザString
をそのままthe answer of @AlexanderMomchliovに記載されているようにそのまま使用できます。
String
として列挙ケースの名前を取得するには、String
にinit(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"
あなたの最初の答えは質問に答えたと思いますが、この編集は答えません。 C#のメソッド 'Enum.GetName(Type、Object)'はenum型と_an object_を使用します。後者の引数は、特定の列挙定数の** value **とその基になる型の点で**です。 "_。現在の答えは、指定された_タイプと大文字小文字の区別(@コンパイル時間の入力)_(例えば、 'Foo.A')のみを使用して印刷します。私はOPが探しているものは、型と 'rawValue'(すなわち、基底型のインスタンス、ここでは' Int'具体的に)を与えられたケースの記述(ランタイム)を出力することです。 – dfri
@dfri私は知っている、それは私を投げている。私はOPが 'rawValue'から' enum'のケースに行きたいと思っていました。しかし、彼自身の答えから、実際には列挙型の場合から 'String'に行くことが分かっていました。 – Alexander
@dfri実際には、私はそれを見て、提供されたC#のセマンティクスに関する私たちの考え方は間違っています。列挙型のケースをStringとして取得します。 – Alexander
これはC#APIのより直接的なコピーですが、私はSwiftにC#を書くことを奨励するべきではないと思います – Alexander
@AlexanderMomchliov Agreed! – dfri