Ответ 1
@Правильный ответ, если вы имеете дело с объектами. Позвольте мне предложить несколько альтернатив:
-
valueForKey:
: Если вы используете[myObject valueForKey:@"myPropertyName"]
, он вернет объект. Если свойство соответствует некоторому примитивному (int
,float
,CGRect
и т.д.), Тогда он будет помещен для вас вNSNumber
илиNSValue
(в зависимости от ситуации). Если он возвращается какNSNumber
, вы можете легко извлечь двойное представление (doubleValue
) и использовать его какNSTimeInterval
для созданияNSDate
. Я бы, вероятно, рекомендовал этот подход. -
Специальный чехол каждый тип.
property_getAttributes()
возвращает achar*
, представляющий все атрибуты свойства, и вы можете извлечь этот тип, выполнив следующее: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 a float } else if (strcmp(rawPropertyType, @encode(int)) == 0) { //it an int } else if (strcmp(rawPropertyType, @encode(id)) == 0) { //it some sort of object } else ....
Это педантично правильнее, чем ответ Луи, потому что, хотя большинство типов имеют односимвольное кодирование, им это не нужно. (его предложение предполагает односимвольное кодирование)
-
Наконец, если вы делаете это в подклассе
NSManagedObject
, я бы рекомендовал проверитьNSPropertyDescription
.
Из этих альтернатив вы, вероятно, увидите, что для того, чтобы ящик времени выполнения имел для вас значение, вероятно, является самым простым.
изменить извлечение типа:
Из приведенного выше кода вы можете извлечь имя класса следующим образом:
if ([typeAttribute hasPrefix:@"[email protected]"] && [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];
} ...
}
Часть меня удивляется, почему: зачем вам так делать? Что вы делаете?