সুইফট: স্ট্রিংয়ে এনাম মান রূপান্তর করবেন?


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 এবং এক্সকোড 7 এ আপনাকে আপনার কোডে কোনও পরিবর্তন করার দরকার নেই, কেবল ব্যবহার করুনprint("\(audience)")
gbdavid

7
আমি ঘৃণা করি যে সুইফট ইকোস্কেপটি এখন এর মতো খুব তারিখের উত্তর দিয়ে পূর্ণ। XCode8.2 / Swift3 হিসাবে, এটি সহজ হিসাবে হিসাবে এরString(describing: yourEnumValue)
ট্রাভিস Griggs

@ ট্র্যাভিসগ্রিগস এটি এখন আর
এক্সকোড

উত্তর:


156

কোন সুইফট সংস্করণে এই বৈশিষ্ট্যটি যুক্ত করা হয়েছিল তা নিশ্চিত নয়, তবে এখনই ( সুইফট ২.১ ) আপনার কেবল এই কোডটি প্রয়োজন:

enum Audience : String {
    case public
    case friends
    case private
}

let audience = Audience.public.rawValue // "public"

যখন স্ট্রিংগুলি কাঁচা মানগুলির জন্য ব্যবহৃত হয়, প্রতিটি মামলার অন্তর্নিহিত মান হ'ল সেই মামলার নামের পাঠ্য

[...]

enum CompassPoint : String {
    case north, south, east, west
}

উপরের উদাহরণে, কমপাসপয়েন্ট.সুথের "দক্ষিণ" এর একটি অন্তর্নিহিত কাঁচা মান রয়েছে, এবং আরও অনেক কিছু।

আপনি তার কাঁচা মূল্য সংখ্যার সাথে একটি গণনা মামলার কাঁচা মান অ্যাক্সেস করতে পারেন:

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

উৎস.


8
xcode7.3 swift2.2 এ, যদি আমি এই জাতীয় জিনিসগুলি print("appState: \(application.applicationState)") করি : আমি পাই appState: UIApplicationState যা এনাম মানটির প্রকৃত স্ট্রিং উপস্থাপনা নয় type আমি কি এখানে কিছু মিস করছি? (PS: RawValue এর জন্য আমি কেবলমাত্র INT মান পেয়েছি ...)
মার্টিন

@ সাইরাস আপনার প্রেক্ষাপটটি এই থ্রেডে জিজ্ঞাসা করা থেকে আলাদা। .rawValueআপনার এনামের কাঁচা মান ফিরিয়ে দেবে। আপনার public enum UIApplicationState : Intযা প্রকৃতপক্ষে টাইপ Int। আপনি আমার উত্তরটি কখনও পড়েন নি যার অ্যাপল ডক্সের উদ্ধৃতি রয়েছে। ... আপনি যদি এখনও UIApplicationStateস্ট্রিংয়ে রূপান্তর করতে চান তবে আমি আপনাকে UIApplicationStateএকটি কাস্টম গণিত সম্পত্তি দিয়ে প্রসারিত করার পরামর্শ দিইextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
দেবআ্যান্ডআর্টিস্ট

স্ট্রিং টাইপ নয় এমন
এনগম থাকাতে

1
@ denis631 আপনার মানে কি? একটি এনামের কাঁচা ধরণের যে কোনও কিছু হতে পারে। আপনি OptionSetযদি সত্যিই চান তবে কোনও এনামও এটি অনুসারে আনতে পারে। এবং মূল প্রশ্নটি যাইহোক স্ট্রিংস সম্পর্কে।
DevAndArtist

1
যদি আমার এনাম এইভাবে লেখা থাকে তবে এনাম টেস্ট: ইন্ট {কেস এ, বি}, কাঁচা মূল্য অবশ্যই অবশ্যই ফিরে আসবে, আমরা যা খুঁজছি তা স্ট্রিং হিসাবে কেসটির নাম পাওয়ার একটি উপায়। @ ড্যানিলশেখুতদিনোভ ঠিক এটি করেছিলেন। তার উত্তরটি দেখুন এবং মূল প্রশ্নে এনামের কোনও স্ট্রিং বা ইন্ট নয়, এনামের কোনও প্রকার নেই।
অস্বীকার 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
প্রিন্টলন স্ট্রিং তৈরির আর একটি ছোট উপায় হ'ল: "foo 'এর স্ট্রিংটি (foo)"
জন এমপি নক্স

3
"জনএম.পি.কনক্স ব্যাক-স্ল্যাশটি ভুলে যাবেন না" স্ট্রিং ফর 'ফু' হ'ল is (ফু) "তে। ঠিক আছে সম্পাদনা করুন , এটি সম্পাদক এ থেকে মুক্তি পাচ্ছে, এটি প্রদর্শনের জন্য আমাকে তাদের মধ্যে 2 টি প্রবেশ করতে হয়েছিল
zmit

এটি CustomStringConvertibleযদি ঠিক এটি কাজ না করে ঠিক কাজ করে তবে তাতে কী লাভ?
ড্যানিয়েল ভ্যান ডার মেরভে

3
CustomStringConvertibleআপনাকে descriptionপ্রতিটি সংখ্যার এনামের ক্ষেত্রে কোন স্ট্রিংটি ব্যবহার করতে হবে তা নির্ধারণ করতে দেয় / সংজ্ঞায়িত করতে আপনাকে প্রয়োজনীয়তা দেয় - এটি অবশ্যই আন্তর্জাতিকীকরণের জন্য এবং সম্ভবত কোড পাঠযোগ্যতার জন্য গুরুত্বপূর্ণ। আপনি যদি সেগুলির বিষয়ে চিন্তা করেন না, তবে আপনি 'এনাম ফু: স্ট্রিং {/ * ... * /} `
GoZoner

2
এটি সঠিক উত্তর যদি আপনার এনাম স্ট্রিং না হয় বা আপনি কোনও ভিন্ন স্ট্রিং চান তবে কাঁচা মূল্য। @ denis631
হাজেন্তি

32

আপাতত, আমি এনামগুলিকে নতুনভাবে সংজ্ঞা দেব:

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

যাতে আমি করতে পারি:

audience.toRaw() // "Public"

তবে, এই নতুন এনাম সংজ্ঞাটি কি অপ্রয়োজনীয় নয়? আমি কি প্রাথমিক এনাম সংজ্ঞা রাখতে পারি এবং এর মতো কিছু করতে পারি:

audience.toString() // "Public"

3
এক্সকোড 7 বিটা 3 হিসাবে আপনি কেবল আপনার উত্তরটি লিখতে পারেন তবে তা না করে = Stringকারণ এটি কোনও সরবরাহ না করা হলে তা স্বয়ংক্রিয়ভাবে একটি কাঁচা মান (কেসের নাম) হয়ে যায়।
Qbyte

3
টু স্ট্রিং () এর পরিবর্তে এখন .rawValue ব্যবহার করুন
সফট ডিজাইনার

সুইফট ১.২ এ আপনি ব্যবহার করতে পারেন: প্রিন্টলন (শ্রোতা.ফ্রেন্ডস.আরওভ্যালু)
ওলেগ পপভ

32

দ্রুত 3 এ, আপনি এটি ব্যবহার করতে পারেন

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

স্ট্রিংয়ের মান পেতে কীভাবে এনাম ব্যবহার করবেন তা সুইফ্ট থেকে


2
এটি সত্যিই সহায়ক, বিশেষত যদি আমার এসenumString
ডাস্পিয়ানবাদী

1
"\(enumValue)"একই জিনিস। ^^
ইনিস্ট

এটি একটি ভাল উত্তর। আপনার এনাম স্ট্রিং ধরণের তৈরি করার দরকার নেই।
স্কর্ড

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

12

এক্সকোড 7 জিএম মুক্তির জন্য আপডেট হয়েছে। এটি এখন আশা করি হিসাবে কাজ করে - ধন্যবাদ অ্যাপল!

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
সুইফট ২.০-তে, CustomStringConvertibleকেবল print(r)এই ক্ষেত্রে কেবল ব্যবহারের অনুমতি দেবে con
ম্যাটম

এক্সকোড 7 বিটা 4-তে, প্রতিবিম্ব () প্রতিবিম্বের পক্ষে প্রতিফলিত হয়েছে বলে মনে হচ্ছে (প্রতিফলিত: এক্স)। তবে, প্রত্যাবর্তিত অবজেক্টের আলাদা কাঠামো রয়েছে।
জি স্নাইডার

1
উত্তরটি আপডেট করুন দয়া করে
বেন সিনক্লেয়ার

10

এটি সুইফট 2 এবং সর্বশেষতম এক্সকোড 7 এর চেয়ে সহজতর হতে পারে না (এনাম টাইপ, বা .rawVueue, বর্ণনাকারী ইত্যাদি নির্দিষ্ট করার দরকার নেই ...)

সুইফট 3 এবং এক্সকোড 8 এর জন্য আপডেট হয়েছে:

    enum Audience {
        case Public
        case Friends
        case Private
    }

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

আমার ইনট ব্যাকড
এনমগুলির

কেবলমাত্র একটি পর্যবেক্ষণ: এটি স্ব-নির্মিত এনামগুলির জন্য কাজ করে তবে এইচকেওয়ার্কআউটঅ্যাক্টিভিটি টাইপ
এস গ্রিন

পাশাপাশি স্থানীয়করণযুক্ত স্ট্রিংগুলির জন্য;)
ইউজিন ব্রাজিনিটস

2
মূল প্রশ্নটি ছিল আপনার নিজের এনামগুলিতে এনাম মানকে স্ট্রিংয়ে রূপান্তর করার বিষয়ে, তাই আমি এর জন্য একটি উত্তর দিয়েছি ... আপনি যদি ইউআইকিট / অ্যাপকিট এনামগুলি পরিচালনা করতে চান তবে অবশ্যই এটি অন্যরকম গল্প।
gbdavid

1
@gbdavid - ইউআইকিট / অ্যাপকিট এনামদের জন্য কি কি প্রশ্ন রয়েছে? আমি googled এবং এটি খুঁজে না। প্রয়োজনে আমি কিউ জমা দিতে পারি।
বেনক

8

এনুম-এ ইনটস ব্যবহার করা হলে একটি সুইফ্ট 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

প্রত্যাশার মতো কাজ করবে এটি সুন্দর নয় এবং কিছুটা ডাউনসাইড রয়েছে কারণ আপনি "এনাম" ব্যবহার করছেন না, আপনি কেবল যুক্ত করে শর্টকাটটি ব্যবহার করতে পারবেন না ri ব্যক্তিগতভাবে উভয়ই স্যুইচ কেস নিয়ে কাজ করবে না।


ঝরঝরে লাগছে। আমি ভাবছি যে এই বিশেষ ক্ষেত্রে সবচেয়ে ভাল অনুশীলন হবে কি। সরলতার কারণে আমি স্ট্রাক্ট সিনট্যাক্সটি ব্যবহার করতে পছন্দ করব তবে এনামের পরিবর্তে স্ট্রাকটি ব্যবহার করা সঠিক বলে মনে হচ্ছে না, অথবা এটি কেবল আমারই হতে পারে? ঠিক আছে, অন্য কোথাও কেবল ধ্রুবক ভেরিয়েবলগুলি ঘোষণা করতে আপনাকে বাধা দেয় না, এবার আপনি কেবল এটি কোনও কাঠামোর ভিতরে যুক্ত করুন যাতে এটির সংগঠিত। থটস?
schystz

ঠিক যেমন, এটি ধ্রুবক ভেরিয়েবল হিসাবে কাজ করে তবে আরও সংগঠিত হয়। যেমন আমি আগেই বলেছিলাম যে একমাত্র সমস্যা হ'ল "সুইচ কেস" এবং শর্টকাটগুলি "riপ্রাইভেট"। যদি আপনি আপনার অ্যাপ্লিকেশনটি স্ক্র্যাচ থেকে তৈরি করছেন তবে "এনুম" দিয়ে যাওয়ার চেষ্টা করুন, "এনাম" কোনও কারণে আপনার কোডটি সন্তুষ্ট না করলে কেবল স্ট্রাক্ট ব্যবহার করুন। আমি ব্যক্তিগতভাবে ধ্রুবক ভেরিয়েবলগুলি এড়ানোর জন্য পরিবর্তে সর্বদা স্ট্র্ট ব্যবহার করি।
অ্যাড্রিয়ানো স্পাদনি

আমি এটি ডিফল্ট কীগুলির জন্য ব্যবহার করি। কোনও অ্যাপ্লিকেশনের মধ্যে ডিফল্ট কীগুলি মনে রাখার পরিবর্তে, আমি কীগুলিকে স্ট্রাক্টে ফেলে ফেলা এবং সেগুলি সেখান থেকে টানতে।
অ্যাড্রিয়ান

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

সুইফট ৩.০ থেকে শুরু করে আপনি পারবেন

var str = String(describing: Audience.friends)

1
অবিশ্বাস্য, তবে এটি পুরোপুরি কার্যকর। "আইডোমেটিক" পদ্ধতির চেয়ে অনেক ছোট। ধন্যবাদ!
রোমান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.