Swift: 열거형 값을 문자열로 변환하시겠습니까?
다음 열거가 지정됩니다.
enum Audience {
case Public
case Friends
case Private
}
스트링을 입수하려면 어떻게 해야 합니까?"Public"
에서audience
아래는 일정합니까?
let audience = Audience.Public
get a string'의 관용 인터페이스는CustomStringConvertible
인터페이스 및 액세스description
겟터'raw type'을 다음과 같이 지정할 수 있지만,description
raw 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 메서드" 가 표시됩니다.보간' 오류입니다.
는, 라고 만, 그 는, 이 동작에 대해 설명되고 있습니다.enum
Apple 문서에서 일부 열거는 실제로 Swift 열거형이 아니라 C-Style 열거형입니다.그리고 애플에 따르면, Swift는 실행 시 Enum의 숫자 값만 가지고 있기 때문에 텍스트 버전을 인쇄할 수 없다.이것은 꽤 많은 API의 경우일 수 있습니다.참조: https://stackoverflow.com/a/70910402/5965609
여기서 제안하는 다른 솔루션은 다음과 같습니다.
Text(String(describing: tcpClient.connection.state))
효과가 있는 것 같습니다만, 여기의 @Eric Aya 코멘트에 의하면, String으로의 변환에는 어떠한 것도 사용하지 말아 주세요.이것은 목적이 아니기 때문에, 많은 경우 예기치 않은 결과를 낳게 됩니다. 문자열 보간 또는 문자열 이니셜라이저를 사용하는 것이 좋습니다.
API 코드로부터의 실행 와 관련짓는 것 .Strings
enum
의 가치.
위의 답변은 모두 동의합니다만, 당신의 열거형 프라이빗 케이스와 퍼블릭 케이스는 기본 키워드이기 때문에 정의할 수 없습니다.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
'programing' 카테고리의 다른 글
명령줄에서 Azure 스토리지 에뮬레이터 데이터를 클리어하는 방법 (0) | 2023.04.21 |
---|---|
파일을 다운로드하지 않고 브라우저에서 열기 (0) | 2023.04.21 |
HTML 테이블에서 Excel Javascript로 (0) | 2023.04.21 |
Azure Web Jobs Dashboard 구성 오류 (0) | 2023.04.21 |
Wireshark에서의 휴대전화 트래픽 캡처 (0) | 2023.04.21 |