no Swift 2 e no xcode7, você não precisa alterar nada no seu código, basta usarprint("\(audience)")
gbdavid
7
Eu odeio que o Swift ecoscape agora esteja cheio de respostas muito antigas assim. No XCode8.2 / Swift3, é tão fácil quantoString(describing: yourEnumValue)
Travis Griggs
@TravisGriggs Ele não funciona mais para o Xcode 11.4
no xcode7.3 swift2.2, se eu fizer coisas como: print("appState: \(application.applicationState)") eu recebo appState: UIApplicationState qual é o tipo e não a representação real da string do valor de enumeração. Estou faltando alguma coisa aqui? (PS: para RawValue eu apenas obter o valor Int ...)
Martin
@Cyrus, seu cenário é diferente do que foi solicitado neste tópico. .rawValueretornará o valor bruto da sua enumeração. O seu é o public enum UIApplicationState : Intque é realmente do tipo Int. Você também nunca leu minha resposta, que tem uma citação dos documentos da Apple. ... Se você ainda deseja converter UIApplicationStatepara string eu sugiro que você estenda UIApplicationStatecom uma propriedade personalizada calculadoextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
DevAndArtist
Não resolve o problema com ter enums de não tipo String
denis631
1
@ denis631 o que você quer dizer? O tipo bruto de um enum pode ser qualquer coisa. Um enum pode estar em conformidade, OptionSetse você realmente quiser. E a pergunta original é sobre Strings de qualquer maneira.
DevAndArtist
1
se meu enum é escrito assim, enum Test: Int {case A, B}, o rawValue retornará naturalmente int de volta, o que estamos procurando é uma maneira de obter o nome do caso como uma String. Foi exatamente isso que @DanilShaykhutdinov fez. Veja a resposta dele e, na pergunta original, o enum não tem tipo, nem uma String ou Int.
Denis631 22/0318
209
A interface idiomática para 'obter uma String' é usar a CustomStringConvertible interface e acessar o descriptiongetter. Defina seu enumcomo:
enumFoo:CustomStringConvertible{caseBingcaseBangcaseBoomvar description :String{switchself{// Use Internationalization, as appropriate.
case.Bing:return"Bing"case.Bang:return"Bang"case.Boom:return"Boom"}}}
Em ação:
>let foo =Foo.Bing
foo:Foo=Bing> println ("String for 'foo' is \(foo)"Stringfor 'foo' isBing
Atualizado : para Swift> = 2.0, substituído PrintableporCustomStringConvertible
Nota : Usar CustomStringConvertiblepermite Fooadotar um tipo bruto diferente. Por exemplo, enum Foo : Int, CustomStringConvertible { ... }é possível. Essa liberdade pode ser útil.
Outra maneira mais curta de criar a string println é: "A string para 'foo' é (foo)"
John MP Knox
3
@ JohnM.P.Knox não se esqueça da barra invertida, como em "String para 'foo' é \ (foo)". Editar OK, é o editor de se livrar dele, eu tinha para entrar 2 deles para que ele aparecer
zmit
Qual é o sentido de CustomStringConvertiblese isso funcionar tão bem sem ele?
Daniel van der Merwe 15/01
3
CustomStringConvertiblepermite / requer que você defina descriptionqual permite que você decida qual string usar para cada caso de enum - isso é importante para a internacionalização com certeza e talvez a legibilidade do código. Se você não se preocupam com aqueles, então você pode usar 'enum Foo: String {/ * ... * /} `
GoZoner
2
Esta é a resposta correta se o seu enum não for uma String ou se você desejar uma string diferente do valor bruto. @ denis631
No Xcode 7 Beta 3, você pode apenas escrever sua resposta, mas sem o = Stringporque ele recebe automaticamente um valor bruto (nome do caso), se você não fornecer nenhum.
Qbyte
3
Em vez de .toString () agora use .rawValue
SoftDesigner
No Swift 1.2, você pode usar: println (Audience.Friends.rawValue)
Oleg Popov
32
No swift 3, você pode usar este
var enumValue =Customer.Physicsvar str =String(describing: enumValue)
Eu gosto desta maneira melhor do que a resposta selecionada, porque eu posso fazerAudience(rawValue: "Friends")
tidwall
12
Atualizado para o lançamento do Xcode 7 GM. Funciona como seria de esperar agora - obrigado 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!"
No Swift 2.0, a conformidade CustomStringConvertiblepermitiria realmente usar apenas print(r)neste caso.
matm
No Xcode 7 beta 4, reflect () parece ter sido desativado em favor do Mirror (refletindo: x). No entanto, o objeto retornado possui uma estrutura diferente.
31915 GSnyder
1
Atualize a resposta, por favor
Ben Sinclair
10
Não poderia ser mais simples do que isso no Swift 2 e no Xcode 7 mais recente (não há necessidade de especificar o tipo de enum ou .rawValue, descritores etc ...)
Atualizado para Swift 3 e Xcode 8:
enumAudience{casePubliccaseFriendscasePrivate}let audience:Audience=.Public// or, let audience = Audience.Public
print(audience)//"Public"
Funcionou perfeitamente com a minha Int apoiado enums
chrislarson
Apenas uma observação: isso funciona para auto criado enums mas não funciona para algo como HKWorkoutActivityType
Ace Verde
Bem como para seqüências de caracteres localizadas;)
Eugene Braginets
2
A pergunta original era sobre a conversão de valor de enumeração em sequência em suas próprias enumerações, e foi isso que eu dei uma resposta ... Se você quiser lidar com as enums do UIKit / AppKit, é claro que é uma história diferente.
Gdavid # 31/16
1
@gbdavid - Existe um Q para UIKit / AppKit Enums? Pesquisei no Google e não consegui encontrar. Posso enviar Q, se necessário.
benc
8
Um exemplo rápido 3 e acima se estiver usando Ints no Enum
Uma solução elegante. "\ (category)" ou diretamente String (descrevendo: category) também funcionariam. Mesmo para enums Int.
t1ser
8
Para quem lê o exemplo no capítulo "Um tour Swift" de "A linguagem de programação Swift" e procura uma maneira de simplificar o método simpleDescription (), a conversão da enum em String ao String(self)fazer isso:
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)}}}
funcionará como esperado. Não é bonito e há algumas desvantagens porque você não está usando uma "enumeração", não é possível usar o atalho apenas adicionando .Private nem funcionará com casos de opção.
Parece arrumado. Gostaria de saber qual seria a melhor prática para este caso em particular. Eu preferiria usar a sintaxe struct por causa da simplicidade, mas usar struct em vez de enum não parece certo, ou talvez seja apenas eu? Bem, nada impede que você apenas declare variáveis constantes em qualquer outro lugar, desta vez, basta adicioná-lo dentro de uma estrutura para que ela seja organizada. Pensamentos?
schystz
Exatamente, funciona como variáveis constantes, mas mais organizadas. Como eu disse antes, o único problema é o "switch case" e os atalhos ".Private". Se você estiver criando a partir do zero seu aplicativo, tente usar "enum", use estruturas apenas se o "enum" não satisfizer seu código por algum motivo. Pessoalmente, evito variáveis constantes e sempre use estruturas.
Adriano Spadoni
Eu uso isso para chaves padrão. Em vez de lembrar as chaves padrão em um aplicativo, eu despejo as chaves em uma estrutura e as puxo de lá.
Adrian
3
Existem várias maneiras de fazer isso. Você pode definir uma função no enum que retorne a string com base no valor do tipo de enum:
enumAudience{...func toString()->String{var a:Stringswitchself{case.Public:
a="Public"case.Friends:
a="Friends"...}return a
}
print("\(audience)")
String(describing: yourEnumValue)
Respostas:
Não sabe em qual versão Swift esse recurso foi adicionado, mas agora ( Swift 2.1 ) você só precisa deste código:
fonte
print("appState: \(application.applicationState)")
eu receboappState: UIApplicationState
qual é o tipo e não a representação real da string do valor de enumeração. Estou faltando alguma coisa aqui? (PS: para RawValue eu apenas obter o valor Int ...).rawValue
retornará o valor bruto da sua enumeração. O seu é opublic enum UIApplicationState : Int
que é realmente do tipoInt
. Você também nunca leu minha resposta, que tem uma citação dos documentos da Apple. ... Se você ainda deseja converterUIApplicationState
para string eu sugiro que você estendaUIApplicationState
com uma propriedade personalizada calculadoextension UIApplicationState { var toString() -> String { /* check self for all diff. cases and return something like "Active" */ }
OptionSet
se você realmente quiser. E a pergunta original é sobre Strings de qualquer maneira.A interface idiomática para 'obter uma String' é usar a
CustomStringConvertible
interface e acessar odescription
getter. Defina seuenum
como:Em ação:
Atualizado : para Swift> = 2.0, substituído
Printable
porCustomStringConvertible
Nota : Usar
CustomStringConvertible
permiteFoo
adotar um tipo bruto diferente. Por exemplo,enum Foo : Int, CustomStringConvertible { ... }
é possível. Essa liberdade pode ser útil.fonte
CustomStringConvertible
se isso funcionar tão bem sem ele?CustomStringConvertible
permite / requer que você definadescription
qual permite que você decida qual string usar para cada caso de enum - isso é importante para a internacionalização com certeza e talvez a legibilidade do código. Se você não se preocupam com aqueles, então você pode usar 'enum Foo: String {/ * ... * /} `Por enquanto, redefinirei a enum como:
para que eu possa fazer:
Mas, essa nova definição de enum não é redundante? Posso manter a definição inicial de enum e fazer algo como:
fonte
= String
porque ele recebe automaticamente um valor bruto (nome do caso), se você não fornecer nenhum.No swift 3, você pode usar este
do Swift como usar enum para obter o valor da string
fonte
enum
não é baseado emString
s"\(enumValue)"
Faz a mesma coisa. ^^Eu gosto de usar
Printable
comRaw Values
.Então nós podemos fazer:
ou
fonte
Audience(rawValue: "Friends")
Atualizado para o lançamento do Xcode 7 GM. Funciona como seria de esperar agora - obrigado Apple!
fonte
CustomStringConvertible
permitiria realmente usar apenasprint(r)
neste caso.Não poderia ser mais simples do que isso no Swift 2 e no Xcode 7 mais recente (não há necessidade de especificar o tipo de enum ou .rawValue, descritores etc ...)
Atualizado para Swift 3 e Xcode 8:
fonte
Um exemplo rápido 3 e acima se estiver usando Ints no Enum
fonte
Para quem lê o exemplo no capítulo "Um tour Swift" de "A linguagem de programação Swift" e procura uma maneira de simplificar o método simpleDescription (), a conversão da enum em String ao
String(self)
fazer isso:fonte
Depois de tentar algumas maneiras diferentes, descobri que se você não quiser usar:
Você ainda pode arquivá-lo usando uma estrutura
então seu código:
funcionará como esperado. Não é bonito e há algumas desvantagens porque você não está usando uma "enumeração", não é possível usar o atalho apenas adicionando .Private nem funcionará com casos de opção.
fonte
Existem várias maneiras de fazer isso. Você pode definir uma função no enum que retorne a string com base no valor do tipo de enum:
Ou você pode tentar o seguinte:
E para usá-lo:
fonte
A partir do Swift 3.0, você pode
fonte