स्विफ्ट: स्ट्रिंग में एनम वैल्यू कन्वर्ट करें?


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

स्विफ्ट 2 और xcode7 में आपको अपने कोड में कुछ भी बदलने की जरूरत नहीं है, बस उपयोग करेंprint("\(audience)")
gbdavid

7
मुझे नफरत है कि स्विफ्ट इकोस्केप अब इस तरह के बहुत दिनांकित उत्तरों से भर गया है। XCode8.2 / Swift3 के रूप में, यह उतना ही आसान हैString(describing: yourEnumValue)
ट्रैविस ग्रिग्स

@TravisGriggs यह Xcode 11.4 के लिए किसी भी लंबे समय तक काम नहीं करता है
DawnSong

जवाबों:


156

निश्चित नहीं है कि किस स्विफ्ट संस्करण में यह सुविधा जोड़ी गई है, लेकिन अभी ( स्विफ्ट 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 में "दक्षिण" का एक निहित कच्चा मूल्य है, और इसी तरह।

आप अपने कच्चे माल के साथ एक संपत्ति मामले के कच्चे मूल्य का उपयोग करते हैं:

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

स्रोत।


8
xcode7.3 स्विफ्ट 2.2 में, अगर मैं इस तरह की चीजें करता हूं: print("appState: \(application.applicationState)") मुझे वह मिलता है appState: UIApplicationState जो टाइप होता है न कि एनम वैल्यू का वास्तविक स्ट्रिंग प्रतिनिधित्व। क्या मुझसे कोई चूक हो रही है? (पुनश्च: रॉवेल्यू के लिए मुझे अभी इंट का मूल्य मिलता है ...)
मार्टिन

@ अपने परिदृश्य से अलग है कि इस धागे में पूछा गया था। .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" */ }
दूंगा

स्ट्रिंग के प्रकार नहीं होने के साथ समस्या का समाधान नहीं करता है
डेनिस 631

1
@ denis631 तुम्हारा क्या मतलब है? एक एनुम का कच्चा प्रकार कुछ भी हो सकता है। OptionSetयदि आप वास्तव में चाहते हैं तो एक एनुम भी अनुरूप हो सकता है। और मूल प्रश्न स्ट्रिंग्स वैसे भी है।
DevAndArtist

1
अगर मेरी एनम इस तरह से लिखी गई है, तो एनुम टेस्ट: इंट {केस ए, बी}, रॉ वेल्यू निश्चित रूप से इंट बैक वापस आ जाएगा, जिसे हम खोज रहे हैं वह केस का नाम स्ट्रिंग के रूप में प्राप्त करने का एक तरीका है। यह ठीक वैसा ही है, जैसा @DanilShaykhutdinov ने किया था। उसके उत्तर को देखें और मूल प्रश्न में एनम का कोई प्रकार नहीं है, न कि स्ट्रिंग या इंट।
डेनिस 631

209

'स्ट्रिंग प्राप्त करना' के लिए मुहावरेदार इंटरफेस का उपयोग करना 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

अपडेट किया गया : स्विफ्ट के लिए = = 2.0, के Printableसाथ प्रतिस्थापितCustomStringConvertible

नोट : उपयोग CustomStringConvertibleकरने Fooसे एक अलग कच्चे प्रकार को अपनाने की अनुमति मिलती है। उदाहरण के लिए enum Foo : Int, CustomStringConvertible { ... }संभव है। यह स्वतंत्रता उपयोगी हो सकती है।


2
Println string बनाने का एक और छोटा तरीका है: "String for 'foo' is (foo)"
John MP Knox

3
@ JohnM.P.Knox बैक-स्लैश को नहीं भूलता जैसा कि "स्ट्रिंग के लिए 'फू' is \ (foo)" है। संपादित करें ठीक है, यह संपादक से छुटकारा पा रहा है, मुझे इसे दिखाने के लिए उनमें से 2 को दर्ज करना पड़ा
zmit

में फ़ायदा क्या है CustomStringConvertibleअगर यह इसके बिना ठीक के रूप में काम करता है?
डैनियल वैन डेर मेरवे

3
CustomStringConvertibleअनुमति देता है / आपको परिभाषित करने की आवश्यकता है descriptionजो आपको यह तय करने की अनुमति देता है कि प्रत्येक एनुम मामले के लिए किस स्ट्रिंग का उपयोग किया जाए - यह निश्चित रूप से अंतर्राष्ट्रीयकरण के लिए महत्वपूर्ण है और शायद कोड पठनीयता। यदि आप उन लोगों की परवाह नहीं करते हैं, तो आप 'एनम फू: स्ट्रिंग {/ * ... * /} का उपयोग कर सकते हैं
GoZoner

2
यह सही उत्तर है यदि आपका एनम स्ट्रिंग नहीं है या आप एक अलग स्ट्रिंग चाहते हैं तो रॉवेल्यू। @ डेनिस 631
हैगेंटी

32

अभी के लिए, मैं एनम को फिर से परिभाषित करूंगा:

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

ताकि मैं कर सकूं:

audience.toRaw() // "Public"

लेकिन, क्या यह नई Enum परिभाषा बेमानी नहीं है? क्या मैं शुरुआती enum परिभाषा रख सकता हूं और कुछ ऐसा कर सकता हूं:

audience.toString() // "Public"

3
Xcode 7 बीटा 3 के रूप में आप अपना उत्तर लिख सकते हैं, लेकिन बिना किसी = Stringकारण के यदि यह स्वचालित रूप से एक कच्चा मान (मामले का नाम) हो जाता है।
क़ब्ते जुले

3
.ToString () के बजाय अब .rawValue
SoftDesigner

स्विफ्ट 1.2 में आप उपयोग कर सकते हैं: Println (Audience.Friends.rawValue)
ओलेग पोपोव

32

स्विफ्ट 3 में, आप इसका उपयोग कर सकते हैं

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

स्विफ्ट से स्ट्रिंग मान प्राप्त करने के लिए एनम का उपयोग कैसे करें


2
यह वास्तव में मददगार है, खासकर अगर मेरा senumString
daspianist

1
"\(enumValue)"एक ही काम करता है। ^ ^
एओनिस्ट

यह एक बेहतर जवाब है। अपने Enum स्ट्रिंग प्रकार बनाने की आवश्यकता नहीं है।
स्कोर

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")
tidwall

12

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

2
स्विफ्ट 2.0 में, CustomStringConvertibleकेवल print(r)इस मामले में उपयोग करने की अनुमति के अनुरूप होगा ।
मैट जूल

Xcode 7 बीटा 4 में, प्रतिबिंबित () दर्पण के पक्ष में अक्षम किया गया लगता है (प्रतिबिंबित: x)। हालाँकि, दिए गए ऑब्जेक्ट की एक अलग संरचना है।
GSnyder

1
कृपया जवाब अपडेट करें
बेन सिनक्लेयर

10

यह स्विफ्ट 2 और लेटेस्ट Xcode 7 (Enum टाइप, या .rawValue, डिस्क्रिप्टर आदि ...) को निर्दिष्ट करने की आवश्यकता नहीं है।

स्विफ्ट 3 और Xcode 8 के लिए अपडेट किया गया:

    enum Audience {
        case Public
        case Friends
        case Private
    }

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

पूरी तरह से मेरे इंट समर्थित
एनम के

बस एक अवलोकन: यह स्व-निर्मित एनम के लिए काम करता है, लेकिन एचकेवर्टआउटएक्टिविटी टाइप के लिए काम नहीं करता है
ऐस ग्रीन

और साथ ही स्थानीयकृत तार के लिए;)
यूजीन ब्रैगनेट्स

2
मूल प्रश्न आपके अपने एनम में स्ट्रिंग के लिए एनुम मान को परिवर्तित करने के बारे में था, इसलिए मैंने इसके लिए एक उत्तर दिया ... यदि आप UIKit / AppKit Enums को हैंडल करना चाहते हैं, तो निश्चित रूप से यह एक अलग कहानी है।
gbdavid

1
@gbdavid - क्या UIKit / AppKit Enums के लिए Q है? मैंने गुगली की और उसे नहीं पाया। अगर जरूरत हो तो मैं क्यू सबमिट कर सकता हूं।
बेन

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

एक सुरुचिपूर्ण समाधान। "\ (श्रेणी)" या सीधे स्ट्रिंग (वर्णन करना: श्रेणी) भी काम करेगा। इंट एनम के लिए भी।
t1ser

8

"द स्विफ्ट प्रोग्रामिंग लैंग्वेज" के "ए स्विफ्ट टूर" चैप्टर में उदाहरण पढ़ने वाले किसी भी व्यक्ति के लिए और सरल तरीका () विधि को आसान बनाने के तरीके की तलाश करते हुए, एनम को स्वयं स्ट्रिंग में परिवर्तित करके 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 के बजाय संरचना का उपयोग करना सही नहीं लगता है, या शायद यह सिर्फ मेरे लिए है? खैर, कुछ भी आपको कहीं भी लगातार चर घोषित करने से रोकता है, इस बार आप इसे केवल एक संरचना के अंदर जोड़ते हैं ताकि इसका आयोजन किया जा सके। विचार?
schystz

वास्तव में, यह निरंतर चर के रूप में काम करता है लेकिन अधिक संगठित है। जैसा कि मैंने कहा था कि एकमात्र समस्या "स्विच केस" और शॉर्टकट ".प्रीयर" है। यदि आप अपने ऐप को स्क्रैच से बना रहे हैं, तो "एनम" के साथ जाने का प्रयास करें, केवल तभी उपयोग करें जब "एनम" किसी कारण से आपके कोड को संतुष्ट नहीं करता है। मैं व्यक्तिगत रूप से कॉन्स्टेंट वैरिएबल से बचने के लिए हमेशा इसके बजाय स्ट्रक्चर्स का उपयोग करता हूं।
एड्रियानो स्पैडोनी

मैं डिफ़ॉल्ट कुंजियों के लिए इसका उपयोग करता हूं। एक ऐप के भीतर डिफ़ॉल्ट कुंजियों को याद रखने के बजाय, मैं कुंजियों को एक संरचना में डंप करता हूं और उन्हें वहां से खींचता हूं।
एड्रियन

3

ऐसा करने के कई तरीके हैं। या तो आप एनम में एक फ़ंक्शन को परिभाषित कर सकते हैं जो एनम प्रकार के मान के आधार पर स्ट्रिंग लौटाता है:

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

स्विफ्ट 3.0 से शुरू आप कर सकते हैं

var str = String(describing: Audience.friends)

1
अविश्वसनीय, लेकिन यह पूरी तरह से काम करता है। "मुहावरेदार" दृष्टिकोण से बहुत कम। धन्यवाद!
रोमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.