আমার সাথে যদি ক, খ, সি, ডি ক্ষেত্রে এনাম থাকে তবে এনাম হিসাবে "এ" স্ট্রিংটি দেওয়া কি আমার পক্ষে সম্ভব?
উত্তর:
অবশ্যই এনামগুলির কাঁচা মূল্য থাকতে পারে। দস্তাবেজগুলি উদ্ধৃত করতে:
কাঁচা মানগুলি স্ট্রিং, অক্ষর বা কোনও পূর্ণসংখ্যা বা ভাসমান-পয়েন্ট সংখ্যা ধরণের হতে পারে
- এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" আইবুকস 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)\"")
দেয়
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)
সুইফট ৪.২-এ, কেসটেটেবল প্রোটোকলটি কাঁচাভ্যালুগুলি সহ একটি এনামের জন্য ব্যবহার করা যেতে পারে, তবে স্ট্রিংটি এনাম কেস লেবেলের সাথে মেলে:
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)")
উচ্চতর জেনারেলাইজড সলিউশন তৈরি করতে djruss70 এর উত্তরে রিফিং:
extension CaseIterable {
static func from(string: String) -> Self? {
return Self.allCases.first { string == "\($0)" }
}
func toString() -> String { "\(self)" }
}
ব্যবহার:
enum Chassis: CaseIterable {
case pieridae, oovidae
}
let chassis: Chassis = Chassis.from(string: "oovidae")!
let string: String = chassis.toString()
দ্রষ্টব্য: এনাম @objc ঘোষণা করা থাকলে দুর্ভাগ্যক্রমে এটি কাজ করবে না। আমি যতদূর জানি সুইফট 5.3 হিসাবে জেনেছি ফোর্ব ফোর্স সলিউশন (একটি স্যুইচ স্টেটমেন্ট) ব্যতীত @objc এনাম এর সাথে কাজ করার কোনও উপায় নেই।
যদি কেউ @objc enums এর জন্য এই কাজটি করার কোনও উপায় সম্পর্কে জানতে পারে তবে আমি উত্তরে আগ্রহী হব।