다음 열거가 주어지면 :
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 인터페이스 를 사용 하고 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 { ... }가능합니다. 이 자유는 유용 할 수 있습니다.
CustomStringConvertible이것이 없으면 제대로 작동한다면 요점은 무엇입니까 ?
CustomStringConvertibledescription각 열거 형 케이스에 사용할 문자열을 결정할 수있는 정의 를 허용 / 요구합니다. 이는 국제화 및 코드 가독성에 중요합니다. 신경 쓰지 않는다면 'enum Foo : String {/ * ... * /}`를 사용할 수 있습니다.
지금은 열거 형을 다음과 같이 재정의합니다.
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
내가 할 수 있도록 :
audience.toRaw() // "Public"
그러나이 새로운 열거 정의가 중복되지 않습니까? 초기 열거 정의를 유지하고 다음과 같이 할 수 있습니까?
audience.toString() // "Public"
= String부터는 답변을 작성할 수 있지만 제공하지 않으면 자동으로 원시 값 (사례 이름)을 얻으므로 답변을 작성할 수 없습니다.
스위프트 3에서는 이것을 사용할 수 있습니다
var enumValue = Customer.Physics
var str = String(describing: enumValue)
enumString
"\(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에서는 이보다 간단 해 질 수 없었습니다 (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"
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
"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)
}
}
}
몇 가지 다른 방법을 시도한 후 사용하지 않으려는 경우 :
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는 스위치 케이스와 함께 작동하지 않습니다.
여러 가지 방법이 있습니다. 열거 형에서 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())