次の列挙型がある場合:
enum Audience {
case Public
case Friends
case Private
}
以下のaudience
定数から文字列"Public"
を取得するにはどうすればよいですか?
let audience = Audience.Public
どの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"
「文字列を取得する」ための慣用的なインターフェイスは、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
に置き換えました
注:CutomStringConvertible
を使用すると、Foo
が別のraw型を採用できます。たとえば、enum Foo : Int, CustomStringConvertible { ... }
が可能です。この自由は便利です。
今のところ、列挙型を次のように再定義します。
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
私ができるように:
audience.toRaw() // "Public"
しかし、この新しい列挙定義は冗長ではありませんか?最初の列挙定義を保持して、次のようなことを行うことはできますか?
audience.toString() // "Public"
Swift 3では、これを使用できます
var enumValue = Customer.Physics
var str = String(describing: enumValue)
Raw Values
でPrintable
を使用するのが好きです。
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"
Xcode 7 GMのリリース用に更新されました。これは今の希望通りに機能します-Appleに感謝!
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!"
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"
「Swiftプログラミング言語」の「A Swiftツアー」の章の例を読んで、enumをStringに変換する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)
}
}
}
EnumでIntsを使用する場合のSwift 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
いくつかの異なる方法を試した後、使用したくない場合:
let audience = Audience.Public.toRaw()
あなたはまだ構造体を使用してそれをアーカイブすることができます
struct Audience {
static let Public = "Public"
static let Friends = "Friends"
static let Private = "Private"
}
あなたのコード:
let audience = Audience.Public
期待どおりに動作します。 "enum"を使用していないため、いくつかの欠点があります。ショートカットを使用することはできません。
これを行うには複数の方法があります。列挙型の値に基づいて文字列を返す関数を列挙型で定義することもできます。
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())