programing

Swift: 열거형 값을 문자열로 변환하시겠습니까?

muds 2023. 4. 21. 21:30
반응형

Swift: 열거형 값을 문자열로 변환하시겠습니까?

다음 열거가 지정됩니다.

enum Audience {
    case Public
    case Friends
    case Private
}

스트링을 입수하려면 어떻게 해야 합니까?"Public"에서audience아래는 일정합니까?

let audience = Audience.Public

get a string'의 관용 인터페이스는CustomStringConvertible 인터페이스 및 액세스description겟터'raw type'을 다음과 같이 지정할 수 있지만,descriptionraw type 실장을 숨기고 문자열 비교를 회피합니다.switch/case 원한다면 국제화를 허용한다.의 정의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

주의: 사용방법CustomStringConvertible허용한다Foo다른 생유형을 채택할 수 있습니다.예를들면enum Foo : Int, CustomStringConvertible { ... }가능합니다.이 자유는 유용할 수 있다.

어떤 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
}

위의 예에서는 Compass Point입니다.south는 암묵적인 원시 값 "south"를 갖는 등입니다.

rawValue 속성을 사용하여 열거 사례의 원시 값에 액세스합니다.

let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"

원천.

swift 3에서는 이것을 사용할 수 있습니다.

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

swift에서 열거를 사용하여 문자열 값을 가져오는 방법

현재 enum을 다음과 같이 재정의합니다.

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"

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

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에서는 이보다 단순할 수 없습니다(enum type, .rawValue, descriptors 등을 지정할 필요가 없습니다).

Swift 3 및 Xcode 8용으로 업데이트됨:

    enum Audience {
        case Public
        case Friends
        case Private
    }

    let audience: Audience = .Public  // or, let audience = Audience.Public
    print(audience) // "Public"

를 사용할 수도 있습니다."\(enumVal)"다음은 예를 제시하겠습니다.

enum WeekDays{ case Sat, Sun, Mon, Tue, Wed, The, Fri } 

let dayOfWeek: String = "\(WeekDays.Mon)"

Swift 5에서 테스트 및 테스트 완료

"Swift Programming Language"의 "A Swift Tour" 장의 예를 읽고 simpleDescription() 메서드를 단순화하는 방법을 찾고 있는 사용자는 다음 작업을 수행하여 열거 자체를 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"을 사용하지 않고 adding만 바로가기를 사용할 수 없기 때문에 예쁘지도 않고 단점도 있습니다.Private도 스위치 케이스에서는 동작하지 않습니다.

Swift 3.0부터는

var str = String(describing: Audience.friends)

현대적인 미니멀리즘 방식

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

    func callAsFunction() -> String {
        self.rawValue
    }
}

let audience = Audience.Public() // "Public"

여기에는 여러 가지 방법이 있습니다.열거형 값을 기반으로 문자열을 반환하는 함수를 정의할 수도 있습니다.

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())

루비 방식 사용

var public: String = "\(Audience.Public)"

한 가지 더

public enum HTTP{
case get
case put
case delete
case patch
var value: String? {
return String(describing: self)
}

정적 문자열을 열거값으로 사용해야 하는 경우 가이드에 의해 친숙합니다.

class EncyclopediaOfCats {
    struct Constants {
        static var playHideAndSeek: String { "Play hide-and-seek" }
        static var eat: String { "Eats" }
        static var sleep: String { "Sleep" }
        static var beCute: String { "Be cute" }
    }
}

enum CatLife {
    case playHideAndSeek
    case eat
    case sleep
    case beCute

    typealias RawValue = String
    
    var rawValue: String {
        switch self {
        case .playHideAndSeek:
            return EncyclopediaOfCats.Constants.playHideAndSeek
        case .eat:
            return EncyclopediaOfCats.Constants.eat
        case .sleep:
            return EncyclopediaOfCats.Constants.sleep
        case .beCute:
            return EncyclopediaOfCats.Constants.beCute
        }
    }
    
    init?(rawValue: CatLife.RawValue) {
        switch rawValue {
        case EncyclopediaOfCats.Constants.playHideAndSeek:
            self = .playHideAndSeek
        case EncyclopediaOfCats.Constants.eat:
            self = .eat
        case EncyclopediaOfCats.Constants.sleep:
            self = .sleep
        case EncyclopediaOfCats.Constants.beCute:
            self = .beCute
        default:
            self = .playHideAndSeek
        }
    }
}

XCode 14.0.1/Swift 5.7:

이것은 간단하게 달성할 수 있는 것입니다만, 몇개의 함정이 있어 매우 혼란스럽습니다.

대부분의 답변에서는 문자열을 각 열거값에 관련짓는 방법 또는 명시적 열거값의 에넘을 작성하는 방법에 대해 설명합니다.Strings을, 을을 enum 。

enums가 이미 존재하는 경우, 예를 들어 Apple API의 수많은 enums와 같이 enums 값을 실제로 변환하고 싶을 수 있습니다.String.

「 」를 표시하는 는, 「 」를 참조해 주세요.NWConnection.States[ Swift ] [ UI ]의 값을 합니다.UI ui ui ui ui ui ui 。

몇 가지 답변에 따르면 다음과 같은 정보가 있다고 가정합니다.

Class tcpClient() {
    var connection: NWConnection
    (...)

그리고나서

Text("Current state: \(tcpClient.connection.state)")

작동해야 합니다.그러나 "No exact matches in call to instance 메서드" 가 표시됩니다.보간' 오류입니다.

는, 라고 만, 그 는, 이 동작에 대해 설명되고 있습니다.enumApple 문서에서 일부 열거는 실제로 Swift 열거형이 아니라 C-Style 열거형입니다.그리고 애플에 따르면, Swift는 실행 시 Enum의 숫자 값만 가지고 있기 때문에 텍스트 버전을 인쇄할 수 없다.이것은 꽤 많은 API의 경우일 수 있습니다.참조: https://stackoverflow.com/a/70910402/5965609

여기서 제안하는 다른 솔루션은 다음과 같습니다.

Text(String(describing: tcpClient.connection.state))

효과가 있는 것 같습니다만, 여기의 @Eric Aya 코멘트에 의하면, String으로의 변환에는 어떠한 것도 사용하지 말아 주세요.이것은 목적이 아니기 때문에, 많은 경우 예기치 않은 결과를 낳게 됩니다. 문자열 보간 또는 문자열 이니셜라이저를 사용하는 것이 좋습니다.

API 코드로부터의 실행 와 관련짓는 것 .Stringsenum의 가치.

위의 답변은 모두 동의합니다만, 당신의 열거형 프라이빗 케이스와 퍼블릭 케이스는 기본 키워드이기 때문에 정의할 수 없습니다.CaseItable을 제 답변에 포함시켰습니다. 루프오버가 필요한 경우 모든 케이스를 입수하는 데 도움이 될 수 있습니다.

enum Audience: String, CaseIterable {
case publicAudience
case friends
case privateAudience

var description: String {
    switch self {
    case .publicAudience: return "Public"
    case .friends: return "Friends"
    case .privateAudience: return "Private"
    }
}

static var allAudience: [String] {
    return Audience { $0.rawValue }
}

}

언급URL : https://stackoverflow.com/questions/24701075/swift-convert-enum-value-to-string

반응형