в Swift 2 и xcode7 вам не нужно ничего менять в своем коде, просто используйтеprint("\(audience)")
gbdavid
7
Я ненавижу то, что экосапорт Свифта теперь заполнен очень устаревшими ответами, подобными этому. Что касается XCode8.2 / Swift3, это так же просто, какString(describing: yourEnumValue)
Трэвис Григгс
@TravisGriggs Это больше не работает для Xcode 11.4
в xcode7.3 swift2.2, если я делаю что-то вроде: print("appState: \(application.applicationState)") я получаю, appState: UIApplicationState который является типом, а не фактическим строковым представлением значения перечисления. Я что-то здесь упускаю? (PS: для rawValue я просто получаю значение Int ...)
Martin
@Cyrus ваш сценарий отличается от того, который был задан в этой теме. .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" */ }
DevAndArtist
Не решает проблему с наличием перечислений не
строкового
1
@ denis631 что ты имеешь ввиду? Необработанный тип перечисления может быть любым. Перечисление может даже соответствовать, OptionSetесли вы действительно хотите. И оригинальный вопрос в любом случае о струнах.
DevAndArtist
1
если мой enum написан так, enum Test: Int {case A, B}, rawValue, конечно, вернет int обратно, и мы ищем способ получить имя case в виде String. Именно это и сделал @DanilShaykhutdinov. Посмотрите на его ответ, и в исходном вопросе enum не имеет типа, ни String, ни Int.
denis631
209
Идиоматический интерфейс для получения строки - это использование CustomStringConvertible интерфейса и доступ к descriptionполучателю. Определите ваш enumкак:
enumFoo:CustomStringConvertible{caseBingcaseBangcaseBoomvar description :String{switchself{// 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)"Stringfor 'foo' isBing
Обновлено : для Swift> = 2.0 заменено PrintableнаCustomStringConvertible
Примечание . Использование CustomStringConvertibleпозволяет Fooиспользовать другой необработанный тип. Например enum Foo : Int, CustomStringConvertible { ... }возможно. Эта свобода может быть полезной.
Другой более короткий способ создать строку println: «Строка для 'foo' is (foo)"
Джон Нокс,
3
@ JohnM.P.Knox не забывайте обратную косую черту, как в "Строка для 'foo' is \ (foo)". Edit OK, это редактор, избавляющийся от него, мне пришлось ввести 2 из них, чтобы он появился
zmit
Какой смысл, CustomStringConvertibleесли это работает так же хорошо без него?
Даниэль ван дер Мерве
3
CustomStringConvertibleпозволяет / требует от вас определить, descriptionчто позволяет вам решить, какую строку использовать для каждого случая перечисления - это, безусловно, важно для интернационализации и, возможно, читабельности кода. Если вас это не волнует, вы можете использовать 'enum Foo: String {/ * ... * /} `
GoZoner
2
Это правильный ответ, если ваше перечисление не является String или вы хотите другую строку, чем rawValue. @ denis631
Начиная с Xcode 7 Beta 3, вы можете просто написать свой ответ, но без такового, = Stringпотому что он автоматически получает необработанное значение (название дела), если вы его не предоставите.
Qbyte
3
Вместо .toString () теперь используйте .rawValue
SoftDesigner
В Swift 1.2 вы можете использовать: println (Audience.Friends.rawValue)
Олег Попов
32
В Swift 3 вы можете использовать это
var enumValue =Customer.Physicsvar str =String(describing: enumValue)
Мне нравится этот способ лучше, чем выбранный ответ, потому что я могу сделатьAudience(rawValue: "Friends")
tidwall
12
Обновлено для выпуска Xcode 7 GM. Это работает, как можно было бы надеяться сейчас - спасибо Apple!
enumRank:Int{caseAce=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!"
Отлично работал с моими перечислениями, поддерживаемыми Int
chrislarson
Просто наблюдение: это работает для самостоятельно созданных перечислений, но не работает для чего-то вроде HKWorkoutActivityType
Ace Green
Как и для локализованных струн;)
Евгений Брагинец
2
Первоначальный вопрос был о преобразовании значения enum в строку в ваших собственных перечислениях, поэтому я дал ответ на этот вопрос ... Если вы хотите работать с перечислениями UIKit / AppKit, конечно, это другая история.
gbdavid
1
@gbdavid - есть ли Q для перечислений UIKit / AppKit? Я погуглил и не смог найти. Я могу представить Q, если это необходимо.
Бен
8
Быстрый пример 3 и выше при использовании Ints в Enum
Элегантное решение. «\ (категория)» или непосредственно строка (описывающая категорию) также будет работать. Даже для Int en.
t1ser
8
Для любого, кто читает пример в главе «Swift Tour» «The Swift Programming Language» и ищет способ упростить метод simpleDescription (), преобразование самого enum в String, сделав String(self)это, сделает это:
enumRank:Int{caseAce=1//required otherwise Ace will be 0
caseTwo,Three,Four,Five,Six,Seven,Eight,Nine,TencaseJack,Queen,Kingfunc simpleDescription()->String{switchself{case.Ace,.Jack,.Queen,.King:returnString(self).lowercaseString
default:returnString(self.rawValue)}}}
будет работать как положено. Это не красиво, и есть некоторые недостатки, потому что вы не используете "enum", вы не можете использовать ярлык, только добавляя .Private ни один не будет работать с переключателями.
Выглядит аккуратно Интересно, что будет лучшей практикой для этого конкретного случая. Я бы предпочел использовать синтаксис struct из-за простоты, но использование struct вместо enum кажется неправильным, или, может быть, это только я? Что ж, ничто не мешает вам просто объявить постоянные переменные где-либо еще, на этот раз вы просто добавляете их в структуру, чтобы она была организована. Мысли?
Schystz
Точно, это работает как постоянные переменные, но более организованно. Как я уже говорил, единственной проблемой является «случай переключения» и ярлыки «.Private». Если вы создаете приложение с нуля, попробуйте использовать «enum», используйте структуры, только если «enum» по какой-то причине не удовлетворяет ваш код. Я лично избегаю использования константных переменных и всегда использую структуры.
Адриано Спадони
Я использую это для ключей по умолчанию. Вместо того, чтобы помнить ключи по умолчанию в приложении, я выкидываю ключи в структуру и извлекаю их оттуда.
Адриан
3
Есть несколько способов сделать это. Либо вы можете определить функцию в перечислении, которая возвращает строку на основе значения типа перечисления:
enumAudience{...func toString()->String{var a:Stringswitchself{case.Public:
a="Public"case.Friends:
a="Friends"...}return a
}
print("\(audience)")
String(describing: yourEnumValue)
Ответы:
Не уверен, в какой версии Swift эта функция была добавлена, но сейчас ( Swift 2.1 ) вам нужен только этот код:
источник
print("appState: \(application.applicationState)")
я получаю,appState: UIApplicationState
который является типом, а не фактическим строковым представлением значения перечисления. Я что-то здесь упускаю? (PS: для rawValue я просто получаю значение Int ...).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" */ }
OptionSet
если вы действительно хотите. И оригинальный вопрос в любом случае о струнах.Идиоматический интерфейс для получения строки - это использование
CustomStringConvertible
интерфейса и доступ кdescription
получателю. Определите вашenum
как:В действии:
Обновлено : для Swift> = 2.0 заменено
Printable
наCustomStringConvertible
Примечание . Использование
CustomStringConvertible
позволяетFoo
использовать другой необработанный тип. Напримерenum Foo : Int, CustomStringConvertible { ... }
возможно. Эта свобода может быть полезной.источник
CustomStringConvertible
если это работает так же хорошо без него?CustomStringConvertible
позволяет / требует от вас определить,description
что позволяет вам решить, какую строку использовать для каждого случая перечисления - это, безусловно, важно для интернационализации и, возможно, читабельности кода. Если вас это не волнует, вы можете использовать 'enum Foo: String {/ * ... * /} `Сейчас я переопределю перечисление как:
так что я могу сделать:
Но не является ли это новое определение перечисления избыточным? Могу ли я сохранить первоначальное определение enum и сделать что-то вроде:
источник
= String
потому что он автоматически получает необработанное значение (название дела), если вы его не предоставите.В Swift 3 вы можете использовать это
от Swift как использовать enum для получения строкового значения
источник
enum
не основан наString
s"\(enumValue)"
Делает то же самое. ^^Мне нравится использовать
Printable
сRaw Values
.Тогда мы можем сделать:
или
источник
Audience(rawValue: "Friends")
Обновлено для выпуска Xcode 7 GM. Это работает, как можно было бы надеяться сейчас - спасибо Apple!
источник
CustomStringConvertible
фактически позволит использовать толькоprint(r)
в этом случае.Это не может быть проще, чем это в Swift 2 и последней версии Xcode 7 (не нужно указывать тип enum или .rawValue, дескрипторы и т. Д.)
Обновлено для Swift 3 и Xcode 8:
источник
Быстрый пример 3 и выше при использовании Ints в Enum
источник
Для любого, кто читает пример в главе «Swift Tour» «The Swift Programming Language» и ищет способ упростить метод simpleDescription (), преобразование самого enum в String, сделав
String(self)
это, сделает это:источник
Попробовав несколько разных способов, я обнаружил, что если вы не хотите использовать:
Вы все еще можете заархивировать его, используя структуру
тогда ваш код:
будет работать как положено. Это не красиво, и есть некоторые недостатки, потому что вы не используете "enum", вы не можете использовать ярлык, только добавляя .Private ни один не будет работать с переключателями.
источник
Есть несколько способов сделать это. Либо вы можете определить функцию в перечислении, которая возвращает строку на основе значения типа перечисления:
Или вы можете попробовать это:
И использовать это:
источник
Начиная с Swift 3.0 вы можете
источник