web-dev-qa-db-ja.com

Swift:列挙値を文字列に変換しますか?

次の列挙型がある場合:

enum Audience {
    case Public
    case Friends
    case Private
}

以下のaudience定数から文字列"Public"を取得するにはどうすればよいですか?

let audience = Audience.Public
107
ma11hew28

どの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"

ソース

112
DevAndArtist

「文字列を取得する」ための慣用的なインターフェイスは、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の場合、PrintableCustomStringConvertibleに置き換えました

CutomStringConvertibleを使用すると、Fooが別のraw型を採用できます。たとえば、enum Foo : Int, CustomStringConvertible { ... }が可能です。この自由は便利です。

176
GoZoner

今のところ、列挙型を次のように再定義します。

enum Audience: String {
    case Public = "Public"
    case Friends = "Friends"
    case Private = "Private"
}

私ができるように:

audience.toRaw() // "Public"

しかし、この新しい列挙定義は冗長ではありませんか?最初の列挙定義を保持して、次のようなことを行うことはできますか?

audience.toString() // "Public"
31
ma11hew28

Swift 3では、これを使用できます

var enumValue = Customer.Physics
var str = String(describing: enumValue)

from enumを使用して文字列値を取得する迅速な方法

23

Raw ValuesPrintableを使用するのが好きです。

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"
21
Simple99

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!"
12
par

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"
9
gbdavid

「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)
        }
     }
   }
5
Vivek Gani

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
4
tsukimi

いくつかの異なる方法を試した後、使用したくない場合:

let audience = Audience.Public.toRaw()

あなたはまだ構造体を使用してそれをアーカイブすることができます

struct Audience {
   static let Public  = "Public"
   static let Friends = "Friends"
   static let Private = "Private"
}

あなたのコード:

let audience = Audience.Public

期待どおりに動作します。 "enum"を使用していないため、いくつかの欠点があります。ショートカットを使用することはできません。

3
Adriano Spadoni

これを行うには複数の方法があります。列挙型の値に基づいて文字列を返す関数を列挙型で定義することもできます。

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())
3
Dhruv Ramani