Я пытаюсь использовать базовые данные NSValueTransformer
для преобразования NSArray
в NSString
. Я не уверен, можно ли его заархивировать, но я видел официальный документ Apple, показывающий фрагмент кода:
@interface ClassNameTransformer: NSValueTransformer {}
@end
@implementation ClassNameTransformer
+ (Class)transformedValueClass { return [NSString class]; }
+ (BOOL)allowsReverseTransformation { return NO; }
- (id)transformedValue:(id)value {
return (value == nil) ? nil : NSStringFromClass([value class]);
}
@end
Кажется, он может хранить данные в NSString
(может быть, я неправильно понял ..), поэтому я попытался, как показано ниже:
@implementation ArrayToStringTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}
+ (Class)transformedValueClass {
return [NSString class];
}
- (id)transformedValue:(id)value {
// return NSStringFromClass([value class]);
// return NSStringFromClass([@"11" class]);
NSLog(@"!!!!!! %@, %@", NSStringFromClass([value class]), value);
if ([value isKindOfClass:[NSString class]])
return NSStringFromClass([value class]);
NSMutableString * string = [NSMutableString string];
for (NSNumber * number in value)
[string appendString:[NSString stringWithFormat:@"%@,", number]];
return string;
}
- (id)reverseTransformedValue:(id)value {
NSArray * array = [value componentsSeparatedByString:@","];
return array;
}
@end
Однако произошел сбой с ошибкой, приведенной ниже (включает NSLog):
[26364:11903] !!!!!! __NSCFString, 0,0
[26364:11903] -[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620
[26364:11903] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x905f620'
Есть идеи? Пожалуйста !!
EDIT:
Ну, я просто преобразую NSArray
в NSData
, и если это тип NSString
, сначала преобразуйте его в NSArray
, затем в NSData
, и он будет работать:
+ (Class)transformedValueClass {
return [NSArray class];
}
- (id)transformedValue:(id)value {
if (! [value isKindOfClass:[NSString class]])
return [NSKeyedArchiver archivedDataWithRootObject:value];
NSLog(@"!!! Convert NSString to NSArray");
NSArray * array = [value componentsSeparatedByString:@","];
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:array];
return data;
}
- (id)reverseTransformedValue:(id)value {
return [NSKeyedUnarchiver unarchiveObjectWithData:value];
}
!!! Внимание здесь
Но мне интересно, правильный ли это путь? Как видите, я return [NSArray class]
в transformedValueClass
методе, но на самом деле возвращаю NSData
значение типа данных в transformedValue:
.
Яблочный док сказал:
Объект NSData, содержащий закодированную форму графа объектов, корневым объектом которого является rootObject
Я в полном замешательстве ...