अगर मेरे पास मामलों के साथ एक एनम है, तो बी, सी, डी क्या मेरे लिए स्ट्रिंग "ए" को एनम के रूप में डालना संभव है?
जवाबों:
ज़रूर। एनम का कच्चा मान हो सकता है। डॉक्स को उद्धृत करने के लिए:
कच्चे मूल्य तार, वर्ण या पूर्णांक या फ्लोटिंग-पॉइंट संख्या प्रकारों में से कोई भी हो सकते हैं
- अंश: Apple Inc. "स्विफ्ट प्रोग्रामिंग लैंग्वेज।" iBooks। https://itun.es/us/jEUH0.l ,
तो आप इस तरह कोड का उपयोग कर सकते हैं:
enum StringEnum: String
{
case one = "one"
case two = "two"
case three = "three"
}
let anEnum = StringEnum(rawValue: "one")!
print("anEnum = \"\(anEnum.rawValue)\"")
नोट: आपको प्रत्येक मामले के बाद = "एक" आदि लिखने की आवश्यकता नहीं है। डिफ़ॉल्ट स्ट्रिंग मान समान होते हैं, इसलिए कॉल करने वाले नाम .rawValue
केवल एक स्ट्रिंग लौटाएंगे
यदि आपको स्ट्रिंग मान की आवश्यकता होती है जिसमें रिक्त स्थान जैसी चीजें शामिल हैं जो केस वैल्यू के हिस्से के रूप में मान्य नहीं हैं तो आपको स्ट्रिंग को स्पष्ट रूप से सेट करने की आवश्यकता है। इसलिए,
enum StringEnum: String
{
case one
case two
case three
}
let anEnum = StringEnum.one
print("anEnum = \"\(anEnum)\"")
देता है
एन्नुम = "एक"
लेकिन अगर आप case
one
"मूल्य एक" प्रदर्शित करना चाहते हैं, तो आपको स्ट्रिंग मान प्रदान करने की आवश्यकता होगी:
enum StringEnum: String
{
case one = "value one"
case two = "value two"
case three = "value three"
}
Hashable
प्रकार का उपयोग नहीं कर सकते ।
case one = "uno"
। अब, "one"
वैल्यू टू एन्यूम कैसे करें ? (कच्चे का उपयोग नहीं कर सकते, क्योंकि वे स्थानीयकरण के लिए उपयोग किए जाते हैं)
= "one"
प्रत्येक मामले के बाद लिखने आदि की आवश्यकता नहीं है । डिफ़ॉल्ट स्ट्रिंग मान केस नामों के समान होते हैं।
जो तुम्हे चाहिए वो है:
enum Foo: String {
case a, b, c, d
}
let a = Foo(rawValue: "a")
assert(a == Foo.a)
let 💩 = Foo(rawValue: "💩")
assert(💩 == nil)
स्विफ्ट 4.2 में, CaseIterable प्रोटोकॉल का उपयोग कच्चे माल के साथ एक एनम के लिए किया जा सकता है, लेकिन स्ट्रिंग को एनम केस लेबल के साथ मेल खाना चाहिए:
enum MyCode : String, CaseIterable {
case one = "uno"
case two = "dos"
case three = "tres"
static func withLabel(_ label: String) -> MyCode? {
return self.allCases.first{ "\($0)" == label }
}
}
उपयोग:
print(MyCode.withLabel("one")) // Optional(MyCode.one)
print(MyCode(rawValue: "uno")) // Optional(MyCode.one)
इंट के प्रकार के साथ एक एनुम के मामले में आप ऐसा कर सकते हैं:
enum MenuItem: Int {
case One = 0, Two, Three, Four, Five //... as much as needs
static func enumFromString(string:String) -> MenuItem? {
var i = 0
while let item = MenuItem(rawValue: i) {
if String(item) == string { return item }
i += 1
}
return nil
}
}
और उपयोग करें:
let string = "Two"
if let item = MenuItem.enumFromString(string) {
//in this case item = 1
//your code
}
enumFromString
आपके द्वारा उपयोग किए जाने वाले प्रत्येक एनम के लिए एक विधि लिखना पागल लगता है।
डंकन सी के जवाब का विस्तार
extension StringEnum: StringLiteralConvertible {
init(stringLiteral value: String){
self.init(rawValue: value)!
}
init(extendedGraphemeClusterLiteral value: String) {
self.init(stringLiteral: value)
}
init(unicodeScalarLiteral value: String) {
self.init(stringLiteral: value)
}
}
स्विफ्ट 4.2:
public enum PaymentPlatform: String, CaseIterable {
case visa = "Visa card"
case masterCard = "Master card"
case cod = "Cod"
var nameEnum: String {
return Mirror(reflecting: self).children.first?.label ?? String(describing: self)
}
func byName(name: String) -> PaymentPlatform {
return PaymentPlatform.allCases.first(where: {$0.nameEnum.elementsEqual(name)}) ?? .cod
}
}
इंट एनम और उनके स्ट्रिंग प्रतिनिधित्व के लिए, मैं एनम की घोषणा इस प्रकार करता हूं:
enum OrderState: Int16, CustomStringConvertible {
case waiting = 1
case inKitchen = 2
case ready = 3
var description: String {
switch self {
case .waiting:
return "Waiting"
case .inKitchen:
return "InKitchen"
case .ready:
return "Ready"
}
}
static func initialize(stringValue: String)-> OrderState? {
switch stringValue {
case OrderState.waiting.description:
return OrderState.waiting
case OrderState.inKitchen.description:
return OrderState.inKitchen
case OrderState.ready.description:
return OrderState.ready
default:
return nil
}
}
}
उपयोग:
order.orderState = OrderState.waiting.rawValue
let orderState = OrderState.init(rawValue: order.orderState)
let orderStateStr = orderState?.description ?? ""
print("orderStateStr = \(orderStateStr)")