@ Ответ Арумана правильный, если вы имеете дело с объектами.Позвольте мне предложить несколько альтернатив:
valueForKey:
: Если вы используете [myObject valueForKey:@"myPropertyName"]
, он вернет объект.Если свойство соответствует некоторому примитиву (int
, float
, CGRect
и т. Д.), То оно будет упаковано для вас в NSNumber
или NSValue
(в зависимости от ситуации).Если он возвращается как NSNumber
, вы можете легко извлечь двойное представление (doubleValue
) и использовать его как NSTimeInterval
для создания NSDate
.Я, вероятно, рекомендую этот подход. Особый случай каждого типа.property_getAttributes()
возвращает char*
, представляющий все атрибуты свойства, и вы можете извлечь тип, выполнив это:
const char * type = property_getAttributes(class_getProperty([self class], "myPropertyName"));
NSString * typeString = [NSString stringWithUTF8String:type];
NSArray * attributes = [typeString componentsSeparatedByString:@","];
NSString * typeAttribute = [attributes objectAtIndex:0];
NSString * propertyType = [typeAttribute substringFromIndex:1];
const char * rawPropertyType = [propertyType UTF8String];
if (strcmp(rawPropertyType, @encode(float)) == 0) {
//it's a float
} else if (strcmp(rawPropertyType, @encode(int)) == 0) {
//it's an int
} else if (strcmp(rawPropertyType, @encode(id)) == 0) {
//it's some sort of object
} else ....
Это педантически более правильно, чем ответ Луи, потому что пока большинство типов имеют односимвольную кодировку, они не должны .(его предложение предполагает односимвольную кодировку)
Наконец, если вы делаете это для подкласса NSManagedObject
, тогда я бы рекомендовал проверить NSPropertyDescription
.
Из этих альтернатив вы, вероятно, можете увидеть, что позволить значению для среды выполнения, вероятно, самое простое.
edit извлечение типа:
Из приведенного выше кода вы можете извлечь имя класса следующим образом:
if ([typeAttribute hasPrefix:@"T@"] && [typeAttribute length] > 1) {
NSString * typeClassName = [typeAttribute substringWithRange:NSMakeRange(3, [typeAttribute length]-4)]; //turns @"NSDate" into NSDate
Class typeClass = NSClassFromString(typeClassName);
if (typeClass != nil) {
[object setValue:[self convertValue:self.value toType:typeClass] forKey:element];
}
}
И затем вместо использования категорий методов класса для преобразования (т. Е. [NSDate convertToDate:]
) создайте методна self
, который делает это за вас и принимает желаемый тип в качестве параметра.Вы могли бы (на данный момент) сделать это следующим образом:
- (id) convertValue:(id)value toType:(Class)type {
if (type == [NSDate class]) {
return [NSDate convertToDate:value];
} else if (type == [NSString class]) {
return [NSString convertToString:value];
} ...
}
Часть меня удивляется: почему, черт возьми, вам нужно делать вещи таким образом?Что ты делаешь?