#ios #objective-c
Вопрос:
У меня есть интерфейс, который выглядит следующим образом: #импорт lt;Foundation/Foundation.hgt;
#import lt;AVFoundation/AVFoundation.hgt; NS_ASSUME_NONNULL_BEGIN @interface AVBase : NSObject @property NSString *portName; @property NSString *uid; @property NSString* port; - (id) initWithPortName:(NSString *)portName andUID:(NSString *)uid andPort:(AVAudioSessionPort)port; @end NS_ASSUME_NONNULL_END
и .m
файл
@implementation AVBase - (id)initWithPortName:(NSString *)portName andUID:(NSString *)uid andPort:(AVAudioSessionPort)port { self = [super init]; if (self) { self.portName = portName; self.uid = uid; self.port = [port description]; } return self; } @end
Я хочу создать массив текущих выходов для сеанса AVAudioSession, поэтому я делаю это так:
NSMutableArray *myArray = [[NSMutableArray alloc] init]; AVAudioSession *session = AVAudioSession.sharedInstance; NSArray *outputs = [[session currentRoute] outputs]; for(AVAudioSessionPortDescription* output in outputs) { AVBase* av = [AVBase alloc]; av = [av initWithPortNumber:output.portName andUID:output.UID andPort:output.portType]; [myArray addObject:av]; } NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:amp;error];
Но когда я пытаюсь сериализовать myArray
, я получаю сообщение об ошибке, в котором говорится:
Exception 'Invalid type in JSON write (AVBase)
Я не понимаю, в чем дело, все свойства в моем классе имеют тип NSString
, поэтому он должен работать.
Ответ №1:
NSJSONSerialization
принимает только NSArray
, NSDictionary
, NSString
, NSNumber
(и NSNull
) для своего верхнего уровня, но также и все подуровни/подпроекты.
myArray
является одним из множества AVBase
, и AVBase
не является одним из них. Вам нужно сначала преобразовать an AVBase
в a NSDictionary
.
-(NSDictionary *)toDict { return @{@"portName": portName, @"uid": uid, @"port": port}; }
Затем:
[myArray addObject:[av toDict]];
Если вы не используете AVBase
или просто для этого , вы можете создать NSDictionary
непосредственно из AVAudioSessionPortDescription *output
, не нужно использовать AVBase
здесь.