스위프트 : 열거 형 값을 문자열로 변환 하시겠습니까?


141

다음 열거가 주어지면 :

enum Audience {
    case Public
    case Friends
    case Private
}

아래 상수 에서 문자열 "Public"을 어떻게 얻 audience습니까?

let audience = Audience.Public

2
이 답변을 확인하십시오, 그것은 당신이 어떻게 그런 일을 달성 할 수 있는지에 대한 아이디어를 줄 수 있습니다 : stackoverflow.com/questions/24648726/enums-with-data-in-swift/…
holex

Swift 2와 xcode7에서는 코드를 변경할 필요가 없습니다.print("\(audience)")
gbdavid

7
나는 Swift 생태계가 이제 이와 같이 매우 오래된 답변으로 채워지는 것을 싫어합니다. XCode8.2 / Swift3의 경우 다음과 같이 쉽습니다.String(describing: yourEnumValue)
Travis Griggs

@TravisGriggs Xcode 11.4에서 더 이상 작동하지 않습니다
DawnSong

답변:


156

이 기능이 어떤 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"

출처.


8
내가 좋아하는 일을 할 경우 xcode7.3의 swift2.2에 : print("appState: \(application.applicationState)") 내가 얻을 appState: UIApplicationState 종류 아닌 열거 값의 실제 문자열 표현이다. 여기에 뭔가 빠졌습니까? (PS : rawValue의 경우 Int 값을 얻습니다 ...)
Martin

@ Cyrus 시나리오 가이 스레드에서 요청한 것과 다릅니다. .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" */ }
DevAndArtist

문자열 유형이 아닌 열거 형 문제를 해결하지 못함
denis631

1
@ denis631 무슨 뜻인가요? 열거 형의 원시 유형은 무엇이든 될 수 있습니다. OptionSet당신이 정말로 원한다면 열거 형도 준수 할 수 있습니다 . 그리고 원래 질문은 문자열에 관한 것입니다.
DevAndArtist

1
내 열거 형이 다음과 같이 작성되면 enum Test : Int {case A, B}, rawValue는 물론 int를 반환합니다. 우리가 찾고있는 것은 케이스의 이름을 문자열로 얻는 방법입니다. 이것은 @DanilShaykhutdinov가 한 일입니다. 그의 대답을보고 원래 질문에서 열거 형에는 String 또는 Int가 아닌 유형이 없습니다.
denis631

209

'문자열 얻기'에 대한 관용적 인터페이스는 CustomStringConvertible 인터페이스 를 사용 하고 descriptiongetter에 액세스하는 것 입니다. 다음 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

업데이트 : 스위프트> = 2.0의 교체 Printable와 함께CustomStringConvertible

참고 :를 사용 CustomStringConvertible하면 Foo다른 원시 유형을 채택 할 수 있습니다 . 예를 들어 enum Foo : Int, CustomStringConvertible { ... }가능합니다. 이 자유는 유용 할 수 있습니다.


2
println 문자열을 만드는 또 다른 짧은 방법은 다음과 같습니다. " 'foo'에 대한 문자열은 (foo) '
John MP Knox

3
@ JohnM.P.Knox는 " 'foo'에 대한 문자열은 \ (foo)"와 같이 백 슬래시를 잊지 않습니다. 편집 OK, 그것은 그것을 제거하는 편집자입니다, 나는 그것을 보이기 위해 그들 중 2 개를 입력해야했습니다
zmit

CustomStringConvertible이것이 없으면 제대로 작동한다면 요점은 무엇입니까 ?
Daniel van der Merwe

3
CustomStringConvertibledescription각 열거 형 케이스에 사용할 문자열을 결정할 수있는 정의 를 허용 / 요구합니다. 이는 국제화 및 코드 가독성에 중요합니다. 신경 쓰지 않는다면 'enum Foo : String {/ * ... * /}`를 사용할 수 있습니다.
GoZoner

2
열거 형이 문자열이 아니거나 rawValue와 다른 문자열을 원하는 경우 정답입니다. @ denis631
Haagenti

32

지금은 열거 형을 다음과 같이 재정의합니다.

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

내가 할 수 있도록 :

audience.toRaw() // "Public"

그러나이 새로운 열거 정의가 중복되지 않습니까? 초기 열거 정의를 유지하고 다음과 같이 할 수 있습니까?

audience.toString() // "Public"

3
Xcode 7 베타 3 = String부터는 답변을 작성할 수 있지만 제공하지 않으면 자동으로 원시 값 (사례 이름)을 얻으므로 답변을 작성할 수 없습니다.
Qbyte

3
.toString () 대신 .rawValue를 사용하십시오.
SoftDesigner

Swift 1.2에서는 다음을 사용할 수 있습니다 : println (Audience.Friends.rawValue)
Oleg Popov


24

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"

1
내가 할 수 있기 때문에 선택한 답변 Audience(rawValue: "Friends")
보다이

12

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

2
Swift 2.0에서는 이 경우 CustomStringConvertible에만 실제로 준수 할 수 print(r)있습니다.
matm

Xcode 7 베타 4에서 reflect ()는 Mirror (reflecting : x)를 위해 비활성화 된 것으로 보입니다. 그러나 반환 된 객체의 구조는 다릅니다.
GSnyder

1
답변을 업데이트하시기 바랍니다
Ben Sinclair

10

Swift 2와 최신 Xcode 7에서는 이보다 간단 해 질 수 없었습니다 (enum 유형 또는 .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"

내 지능이 열거 형 백업으로 완벽하게 일
chrislarson을

단지 관찰 : 이것은 자체 생성 된 열거 형에서는 작동하지만 HKWorkoutActivityType
Ace Green

뿐만 아니라 지역화 된 문자열)
유진 Braginets

2
원래 질문은 열거 형 값을 자신의 열거 형에서 문자열로 변환하는 것에 관한 것이 었습니다. 그래서 내가 대답했습니다 ... UIKit / AppKit 열거 형을 처리하려면 물론 다른 이야기입니다.
gbdavid

1
@gbdavid-UIKit / AppKit 열거에 대한 Q가 있습니까? 나는 구글 검색하고 그것을 찾을 수 없습니다. 필요한 경우 Q를 제출할 수 있습니다.
benc

8

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

우아한 솔루션. "\ (category)"또는 직접 String (describing : category)도 작동합니다. Int 열거 형조차도.
t1ser

8

"Swift Programming Language"의 "Swift Tour"장에서 예제를 읽고 simpleDescription () 메소드를 단순화하는 방법을 찾고있는 사람은 enum 자체를 String으로 변환하여 수행 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)
        }
     }
 }

2
"@objc"와 함께 열거 형을 사용하지 않아야합니다. 이 접근 방식이 실패합니다.
매트 베어 슨

5

몇 가지 다른 방법을 시도한 후 사용하지 않으려는 경우 :

let audience = Audience.Public.toRaw()

여전히 구조체를 사용하여 보관할 수 있습니다

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

그런 다음 코드 :

let audience = Audience.Public

예상대로 작동합니다. "enum"을 사용하지 않기 때문에 예쁘지 않고 몇 가지 단점이 있습니다. 단축키를 추가하는 것만 사용할 수는 없습니다 .Private는 스위치 케이스와 함께 작동하지 않습니다.


깔끔하게 보입니다. 이 특정 사례에 가장 적합한 방법이 무엇인지 궁금합니다. 나는 단순성 때문에 구조체 구문을 사용하는 것을 선호하지만 열거 형 대신 구조체를 사용하는 것이 옳지 않은 것입니까, 아니면 단지 나입니까? 글쎄, 아무것도 다른 곳에서 상수 변수를 선언하는 것을 막을 수는 없습니다. 이번에는 구조체 안에 구조체를 추가하여 체계화하십시오. 생각?
schystz

정확히, 그것은 상수 변수로 작동하지만 더 조직적입니다. 내가 말한 것처럼 유일한 문제는 "스위치 케이스"와 바로 가기 ".Private"입니다. 앱을 처음부터 작성하는 경우 "enum"을 사용하여 "enum"이 어떤 이유로 코드를 만족시키지 않는 경우에만 구조체를 사용하십시오. 나는 개인적으로 상수 변수를 피하고 항상 구조체를 사용합니다.
Adriano Spadoni

나는 이것을 기본 키에 사용합니다. 앱 내에서 기본 키를 기억하는 대신 구조체에 키를 덤프하여 거기에서 가져옵니다.
Adrian

3

여러 가지 방법이 있습니다. 열거 형에서 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())

1

Swift 3.0부터는

var str = String(describing: Audience.friends)

1
믿을 수 없지만 완벽하게 작동합니다. "아이디 오 매틱"접근법보다 훨씬 짧습니다. 감사!
로마
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.