Diberikan enum berikut:
enum Audience {
case Public
case Friends
case Private
}
Bagaimana cara mendapatkan string "Public"
dari audience
konstanta di bawah ini?
let audience = Audience.Public
Diberikan enum berikut:
enum Audience {
case Public
case Friends
case Private
}
Bagaimana cara mendapatkan string "Public"
dari audience
konstanta di bawah ini?
let audience = Audience.Public
print("\(audience)")
String(describing: yourEnumValue)
Jawaban:
Tidak yakin di versi Swift mana fitur ini ditambahkan, tetapi saat ini ( Swift 2.1 ) Anda hanya memerlukan kode ini:
enum Audience : String {
case public
case friends
case private
}
let audience = Audience.public.rawValue // "public"
Saat string digunakan untuk nilai mentah, nilai implisit untuk setiap kasus adalah teks nama kasus tersebut .
[...]
enum CompassPoint : String { case north, south, east, west }
Dalam contoh di atas, CompassPoint.south memiliki nilai mentah implisit "selatan", dan seterusnya.
Anda mengakses nilai mentah kasus enumerasi dengan properti rawValue:
let sunsetDirection = CompassPoint.west.rawValue // sunsetDirection is "west"
print("appState: \(application.applicationState)")
i get appState: UIApplicationState
yang merupakan jenis dan bukan representasi string aktual dari nilai enum. Apakah saya melewatkan sesuatu di sini? (PS: untuk rawValue saya hanya mendapatkan nilai Int ...)
.rawValue
akan mengembalikan nilai mentah enum Anda. Milikmu public enum UIApplicationState : Int
memang tipe Int
. Anda juga belum pernah membaca jawaban saya yang mengutip dari dokumen Apple. ... Jika Anda masih ingin mengonversi UIApplicationState
ke string, saya sarankan Anda untuk memperluas UIApplicationState
dengan properti extension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
OptionSet
jika Anda benar-benar menginginkannya. Dan pertanyaan aslinya adalah tentang Strings.
Antarmuka idiomatik untuk 'mendapatkan String' adalah menggunakan CustomStringConvertible
antarmuka dan mengakses description
pengambil. Tentukan Anda enum
sebagai:
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"
}
}
}
Beraksi:
> let foo = Foo.Bing
foo: Foo = Bing
> println ("String for 'foo' is \(foo)"
String for 'foo' is Bing
Diperbarui : Untuk Swift> = 2.0, diganti Printable
denganCustomStringConvertible
Catatan : Menggunakan CustomStringConvertible
memungkinkan Foo
untuk mengadopsi tipe mentah yang berbeda. Misalnya enum Foo : Int, CustomStringConvertible { ... }
mungkin. Kebebasan ini bisa bermanfaat.
CustomStringConvertible
jika ini bekerja dengan baik tanpanya?
CustomStringConvertible
memungkinkan / mengharuskan Anda untuk menentukan description
yang memungkinkan Anda memutuskan string apa yang akan digunakan untuk setiap kasus enum - ini penting untuk internasionalisasi pasti dan mungkin keterbacaan kode. Jika Anda tidak peduli tentang itu, maka Anda dapat menggunakan 'enum Foo: String {/ * ... * /} `
Di swift 3, Anda bisa menggunakan ini
var enumValue = Customer.Physics
var str = String(describing: enumValue)
dari Swift cara menggunakan enum untuk mendapatkan nilai string
enum
tidak didasarkan pada String
s
"\(enumValue)"
Melakukan hal yang sama. ^^
Untuk saat ini, saya akan mendefinisikan ulang enum sebagai:
enum Audience: String {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
}
sehingga saya dapat melakukan:
audience.toRaw() // "Public"
Tapi, bukankah definisi enum baru ini berlebihan? Dapatkah saya menyimpan definisi enum awal dan melakukan sesuatu seperti:
audience.toString() // "Public"
= String
karena secara otomatis mendapat nilai mentah (nama kasus) jika Anda tidak memberikannya.
Saya suka menggunakan Printable
dengan Raw Values
.
enum Audience: String, Printable {
case Public = "Public"
case Friends = "Friends"
case Private = "Private"
var description: String {
return self.rawValue
}
}
Kemudian kita bisa melakukan:
let audience = Audience.Public.description // audience = "Public"
atau
println("The value of Public is \(Audience.Public)")
// Prints "The value of Public is Public"
Audience(rawValue: "Friends")
Diperbarui untuk rilis Xcode 7 GM. Ini berfungsi seperti yang diharapkan sekarang - terima kasih 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!"
CustomStringConvertible
sebenarnya akan memungkinkan penggunaan hanya print(r)
dalam kasus ini.
Ini tidak bisa lebih sederhana dari ini di Swift 2 dan Xcode 7 terbaru (tidak perlu menentukan jenis enum, atau .rawValue, deskriptor dll ...)
Diperbarui untuk Swift 3 dan Xcode 8:
enum Audience {
case Public
case Friends
case Private
}
let audience: Audience = .Public // or, let audience = Audience.Public
print(audience) // "Public"
Contoh cepat 3 ke atas jika menggunakan Ints di Enum
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
Bagi siapa pun yang membaca contoh dalam bab "A Swift Tour" dari "Bahasa Pemrograman Swift" dan mencari cara untuk menyederhanakan metode simpleDescription (), mengonversi enum itu sendiri ke String dengan melakukan String(self)
akan melakukannya:
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)
}
}
}
Setelah mencoba beberapa cara berbeda, saya menemukan bahwa jika Anda tidak ingin menggunakan:
let audience = Audience.Public.toRaw()
Anda masih dapat mengarsipkannya menggunakan struct
struct Audience {
static let Public = "Public"
static let Friends = "Friends"
static let Private = "Private"
}
lalu kode Anda:
let audience = Audience.Public
akan bekerja seperti yang diharapkan. Tidak cantik dan ada beberapa kelemahan karena Anda tidak menggunakan "enum", Anda tidak dapat menggunakan pintasan yang hanya menambahkan. Pribadi juga tidak akan berfungsi dengan kasus sakelar.
Ada banyak cara untuk melakukan ini. Anda bisa menentukan fungsi dalam enum yang mengembalikan string berdasarkan nilai tipe enum:
enum Audience{
...
func toString()->String{
var a:String
switch self{
case .Public:
a="Public"
case .Friends:
a="Friends"
...
}
return a
}
Atau Anda bisa mencoba ini:
enum Audience:String{
case Public="Public"
case Friends="Friends"
case Private="Private"
}
Dan untuk menggunakannya:
var a:Audience=Audience.Public
println(a.toRaw())
Mulai dari Swift 3.0 Anda bisa
var str = String(describing: Audience.friends)
Satu cara lagi
public enum HTTP{
case get
case put
case delete
case patch
var value: String? {
return String(describing: self)
}