次の列挙型があるとします。
enum Audience {
case Public
case Friends
case Private
}
以下"Public"のaudience定数から文字列を取得するにはどうすればよいですか?
let audience = Audience.Public
print("\(audience)")
String(describing: yourEnumValue)
次の列挙型があるとします。
enum Audience {
case Public
case Friends
case Private
}
以下"Public"のaudience定数から文字列を取得するにはどうすればよいですか?
let audience = Audience.Public
print("\(audience)")
String(describing: yourEnumValue)
回答:
この機能が追加されたSwiftのバージョンはわかりませんが、現在(Swift 2.1)に必要なコードは次のとおりです。
enum Audience : String {
case public
case friends
case private
}
let audience = Audience.public.rawValue // "public"
文字列が未加工の値に使用される場合、各ケースの暗黙的な値は、そのケースの名前のテキストです。
[...]
enum CompassPoint : String { case north, south, east, west }上記の例では、CompassPoint.southの暗黙的な生の値は「south」などです。
rawValueプロパティを使用して、列挙型ケースの生の値にアクセスします。
let sunsetDirection = CompassPoint.west.rawValue // sunsetDirection is "west"
print("appState: \(application.applicationState)") こと appState: UIApplicationState をすると、これはタイプであり、列挙値の実際の文字列表現ではありません。ここで何か不足していますか?(PS:rawValueの場合、Int値を取得します...)
.rawValue列挙型の生の値を返します。あなたのpublic enum UIApplicationState : Intものは確かにタイプIntです。また、Appleのドキュメントからの引用がある私の回答を読んだこともありません。...それでもUIApplicationState文字列に変換したい場合UIApplicationStateは、カスタムの計算プロパティで拡張することをお勧めしますextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
OptionSet本当に必要な場合にも準拠できます。元の質問はとにかく文字列についてです。
「文字列を取得する」ための慣用的なインターフェースは、CustomStringConvertible インターフェースを使用してdescriptionゲッターにアクセスすることです。enumとして定義:
enum Foo : CustomStringConvertible {
case Bing
case Bang
case Boom
var description : String {
switch self {
// Use Internationalization, as appropriate.
case .Bing: return "Bing"
case .Bang: return "Bang"
case .Boom: return "Boom"
}
}
}
実行中:
> let foo = Foo.Bing
foo: Foo = Bing
> println ("String for 'foo' is \(foo)"
String for 'foo' is Bing
更新:Swift> = 2.0の場合Printable、CustomStringConvertible
注:を使用CustomStringConvertibleするFooと、別のrawタイプを採用できます。たとえばenum Foo : Int, CustomStringConvertible { ... }可能です。この自由は役に立ちます。
CustomStringConvertibleなくても同じように機能する場合、何が重要ですか?
CustomStringConvertibledescriptionenumの各ケースにどの文字列を使用するかを決定できるように定義することを許可/要求します-これは国際化にとって、そしておそらくコードの可読性にとって重要です。それらを気にしない場合は、 'enum Foo:String {/ * ... * /} `を使用できます
ここでは、列挙型を次のように再定義します。
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
私ができるように:
audience.toRaw() // "Public"
しかし、この新しい列挙型定義は冗長ではありませんか?最初の列挙型の定義を保持して、次のようなことはできますか?
audience.toString() // "Public"
= String以降は、答えを書くことができますが、何も指定しないと生の値(ケースの名前)が自動的に取得されるため、答えを書く必要はありません。
Swift 3では、これを使用できます
var enumValue = Customer.Physics
var str = String(describing: enumValue)
enumがStringsに基づいていない場合に非常に役立ちます
"\(enumValue)"同じことをします。^^
で使用するのPrintableが好きRaw Valuesです。
enum Audience: String, Printable {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
var description: String {
return self.rawValue
}
}
その後、次のことができます。
let audience = Audience.Public.description // audience = "Public"
または
println("The value of Public is \(Audience.Public)")
// Prints "The value of Public is Public"
Audience(rawValue: "Friends")
Xcode 7 GMのリリース用に更新されました。それは今望んでいるように機能します-アップルに感謝します!
enum Rank:Int {
case Ace = 1, Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King
}
let r = Rank.Ace
print(r) // prints "Ace"
print("Rank: \(r)!") // prints "Rank: Ace!"
CustomStringConvertibleばprint(r)、この場合でも実際に使用できます。
Swift 2と最新のXcode 7では、これより簡単にすることはできません(列挙型、.rawValue、記述子などを指定する必要はありません)。
Swift 3およびXcode 8用に更新:
enum Audience {
case Public
case Friends
case Private
}
let audience: Audience = .Public // or, let audience = Audience.Public
print(audience) // "Public"
EnumでIntsを使用する場合の迅速な3以上の例
public enum ECategory : Int{
case Attraction=0, FP, Food, Restroom, Popcorn, Shop, Service, None;
var description: String {
return String(describing: self)
}
}
let category = ECategory.Attraction
let categoryName = category.description //string Attraction
「The Swift Programming Language」の「A Swift Tour」の章の例を読んでいて、simpleDescription()メソッドを単純化する方法を探している人は、列挙型自体を文字列に変換するString(self)ことで実現できます。
enum Rank: Int
{
case Ace = 1 //required otherwise Ace will be 0
case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
case Jack, Queen, King
func simpleDescription() -> String {
switch self {
case .Ace, .Jack, .Queen, .King:
return String(self).lowercaseString
default:
return String(self.rawValue)
}
}
}
いくつかの異なる方法を試した後、使用したくない場合は、次のことがわかりました。
let audience = Audience.Public.toRaw()
あなたはまだ構造体を使用してそれをアーカイブすることができます
struct Audience {
static let Public = "Public"
static let Friends = "Friends"
static let Private = "Private"
}
次にあなたのコード:
let audience = Audience.Public
期待どおりに動作します。それはきれいではなく、「列挙型」を使用しないため、いくつかの欠点があります。ショートカットを使用して.Privateを追加するだけでは、スイッチケースでは機能しません。
これには複数の方法があります。列挙型の値に基づいて文字列を返す関数を列挙型で定義することもできます。
enum Audience{
...
func toString()->String{
var a:String
switch self{
case .Public:
a="Public"
case .Friends:
a="Friends"
...
}
return a
}
または、これを試すことができます:
enum Audience:String{
case Public="Public"
case Friends="Friends"
case Private="Private"
}
そしてそれを使うには:
var a:Audience=Audience.Public
println(a.toRaw())
Swift 3.0以降では、
var str = String(describing: Audience.friends)