2008-11-20 12 views
14

Tengo problemas con este código:¿Cómo echo el id a una carroza?

NSRect itemFrame; 
id item; 
// code to assign item goes here. 
itemFrame.origin.y -= [item respondsToSelector:@selector(selectedHeight)] ? [item selectedHeight] : [self defaultSelectedHeight]; 

Este es el poco problemático:

[item selectedHeight] 

El compilador está asumiendo que el tipo de retorno es ID. Pensé que agregar un molde arreglaría esto:

(float)[item selectedHeight] 

pero no funciona.

¿Qué estoy haciendo mal? (Sospecho que el problema tiene que ver con la resolución de punteros relacionados con el ID, pero no puedo encontrar ninguna documentación relevante).

Respuesta

34

desea [[item selectedHeight] floatValue], suponiendo que la HeightHeight seleccionada devuelve NSNumber.

1

Debe mirar la declaración de su método selectedHeight. El problema es que el método devuelve un puntero a un objeto (id) o que no ha importado el archivo de encabezado item en el archivo que contiene el fragmento de código, por lo que Xcode asume que es un puntero de manera predeterminada.

No puede lanzar un puntero a un flotador, ya que son tipos fundamentalmente incompatibles. Una vez que hayas aclarado tus declaraciones, deberías estar bien.

1

El compilador realiza ese tipo de suposiciones cuando varias clases declaran métodos con el mismo nombre, que devuelven tipos diferentes. Dado que la variable "artículo" se escribe como "id", el compilador no sabe a cuál de estas clases enviará el mensaje en tiempo de ejecución y elige una.

Para evitar este problema, puede informar al compilador qué "elemento" de clase es una instancia de, al declarar que con un tipo específico en lugar de la "Identificación" genérico:

SomeItemClass *item; 

También podría evitar al no declarar métodos con nombres idénticos que devuelven tipos diferentes.

5

Sé que el código siguiente funciona para iOS 6 SDK. Supongo que el objeto obj contiene un valor flotante.

id obj; 
float fVal; 

fVal = [obj floatValue]; 
Cuestiones relacionadas