El registro de una rápida enumeración de usar NSLog

Estoy tratando de registro de una enumeración:

enum CKAccountStatus : Int {
    case CouldNotDetermine
    case Available
    case Restricted
    case NoAccount
}

NSLog("%i", CKAccountStatus.Available)

El compilador se queja:

Type 'CKAccountStatus' does not conform to protocol 'CVarArg'

¿Por qué? He tratado de convertir el valor:

NSLog("%i", CKAccountStatus.Available as Int)

Pero que no vuela ya sea:

Cannot convert the expression's type '()' to type 'String'
  • intenta println?
  • Yo lo hice, imprime (Enum Value). Correcto, pero no es muy útil 🙂
InformationsquelleAutor zoul | 2014-06-05

7 Kommentare

  1. 28

    Obtener la enumeración subyacente Int valor:CKAccountStatus.Available.rawValue.

    Las enumeraciones no son estrictamente enteros en Swift, pero si se declara con un tipo subyacente de que usted puede conseguir con rawValue — lo que subyace tipo es. (enum Foo: String le dará cadenas para el rawValue, etc.) Si una enumeración no tiene un tipo subyacente, rawValue no tiene nada para darle. En Api importados de ObjC, cualquier enumeración definido con NS_ENUM tiene un subyacente de tipo entero (normalmente Int).

    Si quieres imprimir cualquier enum más descriptivamente, usted podría considerar la posibilidad de hacer una extensión en el tipo de enumeración que adopta la Printable protocolo.

    • He encontrado por simple Int las enumeraciones, .hashValue también le dará acceso a la Int valor.
    • El uso de hashValue sería el abuso de la API de contrato. Un Hashable tipo requiere que hashValue ser idénticos para la «igualdad» de los valores y la única otra manera, pero no hace ninguna otra garantía… incluso si es coincidencia que devuelve el mismo como rawValue para un Int tipo enum, usted no sabe que no va a cambiar en el futuro. Siempre es mejor elegir la API que documentado para hacer lo que quieras sobre el que pasa a hacer lo que quiera.
  2. 7

    Un enum es, efectivamente, opaco. Puede tener valores sin procesar, que se puede obtener; pero muchas de las enumeraciones no. (Usted no tiene que declarar la enumeración que tienen un tipo, y si no, no hay raw de valores). Lo que yo haría es darle a la enumeración de una description método para llamar de forma explícita.

    La única manera de distinguir la enumeración del valor de la corriente es a través de una instrucción switch, por lo que su description método de tratar cada caso y en cada caso de la instrucción switch se devolverá un diferente valor descriptivo.

    enum Suit {
        case Hearts, Diamonds, Spades, Clubs
        func description () -> String {
            switch self {
            case Hearts:
                return "hearts"
            case Diamonds:
                return "diamonds"
            case Spades:
                return "spades"
            case Clubs:
                return "clubs"
            }
        }
    }
    
    var suit = Suit.Diamonds
    println("suit \(suit.description())")  // suit diamonds
  3. 5

    Este es mi enfoque:

    enum UserMode : String
    {
       case Hold = "Hold";
       case Selecting = "Selecting";
       case Dragging = "Dragging";
    }

    Entonces, cada vez que lo necesito para imprimir el valor en crudo:

    //Assuming I have this declared and set somewhere
    var currentMode: UserMode = .Selecting;

    Haciendo

    NSLog("CurrentMode \(_currMode.rawValue)");

    Va a imprimir:

    CurrentMode La Selección De

  4. 1

    De la Swift docs:

    Si usted está familiarizado con C, se sabe que C enumeraciones asignar nombres relacionados a un conjunto de valores enteros. Enumeraciones en Swift son mucho más flexibles, y no tiene que proporcionar un valor para cada uno de los miembros de la enumeración. Si un valor (conocido como «raw») el valor se proporciona para cada miembro de la enumeración, el valor puede ser una cadena, un personaje, o un valor de número entero o de punto flotante tipo.

    Por lo tanto, usted no puede intentar echarlo a y de tipo Int. En cuanto a tu primer problema con el que parece que NSLog() está buscando un parámetro de tipo C-variable, que no se aplica a Swift enumeraciones.

  5. 0

    Veo, las enumeraciones no son números en Swift:

    A diferencia de C y Objective-C, Swift miembros de la enumeración no están asignados a un
    por defecto valor entero cuando se crean. En el CompassPoints
    ejemplo de arriba, Norte, Sur, Este y Oeste no implícitamente igual a 0,
    1, 2 y 3. En lugar de ello, los diferentes miembros de la enumeración son
    pleno de valores en su propio derecho, con un explícitamente definidos
    tipo de CompassPoint.

    Hay una manera fácil de registrar el valor, entonces? Ah, ahí está:

    NSLog("%i", CKAccountStatus.Available.toRaw())
  6. 0

    Puede utilizar el toRaw() función para obtener la Int Valor de la enumeración como sigue:

    import Foundation
    
    enum CKAccountStatus : Int {
        case CouldNotDetermine
        case Available
        case Restricted
        case NoAccount
    }
    
    let block = {(status: Int) -> Void in
        NSLog("%d", status)
    }
    
    let status = CKAccountStatus.Available.toRaw()
    block(status) // prints "1"
    • Cómo imprimir «Disponible» ?
  7. 0

    Por mi Error enumeraciones yo uso

    public var localizedDescription : String { return String(reflecting: self) }

    para otras enumeraciones no es el CustomStringConvertible protocolo que puede ser utilizado como

    public var description : String { return String(reflecting: self) }

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...