Como por tema, cómo puedo comprobar si un objeto es un NSArray o NSDictionary?

4 Comentarios

  1. 95
    if([obj isKindOfClass:[NSArray class]]){
        //Is array
    }else if([obj isKindOfClass:[NSDictionary class]]){
        //is dictionary
    }else{
        //is something else
    }
  2. 8

    Considerar el caso cuando estás analizar los datos de un JSON o XML de respuesta. Según el análisis de la biblioteca que está utilizando, usted no puede terminar con NSArrays o NSDictionaries. En lugar usted puede tener __NSCFArray o __NSCFDictionary.

    En ese caso, la mejor manera de comprobar si usted tiene una matriz o un diccionario para comprobar si responde a un selector que sólo una matriz o un diccionario responder a:

    if([unknownObject respondsToSelector:@selector(lastObject)]){
    
    //You can treat unknownObject as an NSArray
    }else if([unknownObject respondsToSelector:@selector(allKeys)]){
    
    //You can treat unknown Object as an NSDictionary
    }
    • -1 Muchos objetos pueden responder a la misma selectores, especialmente algo tan genérico como lastObject o allKeys. El uso de isKindOfClass: es claramente el camino a seguir cuando se trata de la clase de los clústeres como NSArray y NSDictionary.
    • La respuesta es absurdo total. [myObject isKindOfClass:[NSArray clase]] no responde correctamente a la pregunta «¿myObject se comportan como si es un NSArray», y eso es lo que quieres. No hay selector de que sólo un NSArray o NSDictionary iba a responder. En dos minutos me puede crear una clase con métodos de instancia «allKeys» y «lastObject». O añadir «allKeys» como una categoría de método para NSArray.
  3. 0

    Sólo en caso de que alguien llega tarde a esta parte buscando un Swift equivalente, aquí la tiene. Es mucho más elegante que el Objetivo-C versión, en mi humilde opinión, porque no sólo es comprobar los tipos, pero arroja ellos para el tipo deseado al mismo tiempo:

    if let arrayVersion = obj as? NSArray {
        //arrayVersion is guaranteed to be a non-`nil` NSArray
    } else if let dictionaryVersion = obj as? NSDictionary {
        //dictionaryVersion is guaranteed to be a non-`nil` NSDictionary
    } else {
        //it's neither
    }

Dejar respuesta

Please enter your comment!
Please enter your name here