Swift: преобразовать значение перечисления в строку?



учитывая следующее перечисление:



enum Audience {
case Public
case Friends
case Private
}


как мне получить строку "Public" С audience постоянная ниже?



let audience = Audience.Public
582   11  

11 ответов:

не уверен, в какой версии 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.Юг имеет неявное сырое значение "юг", и так далее.

вы получаете доступ к необработанному значению случай перечисления с его значением 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 принять разный тип. Например enum Foo : Int, CustomStringConvertible { ... } возможно. Эта свобода может быть полезной.

сейчас я переопределю перечисление как:

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

Так что я могу сделать:

audience.toRaw() // "Public"

но разве это новое определение перечисления не является избыточным? Могу ли я сохранить начальное определение перечисления и сделать что-то вроде:

audience.toString() // "Public"

мне нравится использовать 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"

в swift 3, Вы можете использовать это

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

С Swift как использовать перечисление, чтобы получить строковое значение

обновлено для выпуска 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"

для тех, кто читает пример в главе" a Swift Tour "раздела" язык программирования Swift" и ищет способ упростить метод 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

будет работать, как ожидалось. Это не очень красиво, и есть некоторые недостатки, потому что вы не используете "перечисление", вы не можете использовать ярлык только добавление .Частный ни будет работать с чехлами коммутаторов.

есть несколько способов сделать это. Либо вы можете определить функцию в перечислении, которая возвращает строку на основе значения типа 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())

пример swift 3 и выше при использовании Ints в Enum

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

Comments

    Ничего не найдено.