Рассмотрим следующий класс JSExported target-c со свойством NSObject *:
@protocol MyObjectExport <JSExport>
@property (nonatomic, strong) NSObject *myProperty;
@end
@interface MyObject : NSObject <MyObjectExport>
@end
@implementation MyObject
- (NSObject *)myProperty
{
NSLog(@"in myProperty");
return nullptr;
}
- (void)setMyProperty:(NSObject *)myProperty
{
NSLog(@"in setMyProperty");
}
@end
Если я выполню этот код:
{
JSContext *context = [[JSContext alloc] init];
context[@"myObject"] = [[MyObject alloc] init];
[context evaluateScript:@"var foo = myObject.myProperty; myObject.myProperty = foo;"];
}
Вызываются как myProperty, так и setMyProperty.
Но если я выполню этот код:
{
JSContext *context = [[JSContext alloc] init];
context[@"myObject"] = [[MyObject alloc] init];
[context evaluateScript:@"myObject.myProperty = \"foo\";"];
}
setMyProperty не вызывается, предположительно, потому, что "foo" не совместим с NSObject *.
Однако, если я выполню этот код:
{
MyObject *myObject = [[MyObject alloc] init];
myObject.myProperty = @"foo";
}
setMyProperty вызывается.
Конечно, если я заменю NSObject * на NSString *, все будет работать нормально. Но мне нужно это свойство, чтобы иметь возможность хранить различные типы объектов.
Я не контролирую то, что передается в AssessmentScript. Однако есть ли способ, которым я могу кодировать вещи, чтобы JavaScriptCore универсально преобразовывал «foo» в NSString * перед передачей его обратному вызову target-c? Я понимаю, что могу перехватить вызов на стороне javascript и выполнить там необходимые действия, но я бы хотел избежать этого, если это возможно.