2017-03-28 4 views
1

내 앱에 JavascriptCore을 사용하고 있습니다. 이제, Objective-C로 다시 전달할 수있는 JSContext에 몇 가지 변수를 전달할 것입니다. 그러나 변수 중 하나 인 NSDictionary가 제대로 전달되지 않습니다.Javascript에서 NSDictionary를 JavascriptCore의 Objective-c로 전달합니다.

var evaluate = function(variables) { 
    app.setDictionary(variables.dictionary); 
} 

JSContext에서 설정이 다음과 같은 방법을 가지고 간단한 예입니다 : 나는 아래의 코드를 실행합니다.

- (void)setDicationary:(NSDictionary *)dictionary { 
    self.mutableDictionary = [dictionary mutableCopy]; 
} 

variables.dictionary입니다 :

이는 setDictionary() 방법입니다

- (NSDictionary *)dictionary { 
    return self.values; 
} 

그리고 이것이 내가 evaluate() 전화하는 방법입니다 다음 setDictionary 방법으로, 그러나

JSValue *jsFunction = self.context[@"evaluate"]; 
JSValue *value = [jsFunction callWithArguments:@[self.variables]]; 

을, 나는 NSDictionary를 얻지 않지만 NSString을 얻는다. 동등한 [object Object].

어떻게 해결할 수 있을까요?

+0

질문에 Objective-C 코드를 추가하십시오. –

+0

@BorisVerebsky 나는 그것을 추가했다! – user4992124

답변

1

JavaScriptCore는 Objective-C 또는 Swift와 JavaScript 사이의 유형을 자동으로 변환하지만 명시적인 변환을 구현하는 것이 좋습니다. 개발자가 예상 할 수있는 것처럼 자동 변환이 항상 작동하는 것은 아닙니다. 예를 들어 undefinedNSString이 사용되는 경우 @"undefined"으로 변환됩니다. 당신은 당신이 목표 - C 코드에 전달하는 인수에 매우 조심해야한다, 그래서 자바 스크립트, 사전으로 객체를 사용하는

- (void)setDicationary:(JSValue *)jsDictionary { 
    if ([jsDictionary isUndefined] || [jsDictionary isNull]) { 
     jsDictionary = nil; 
    } 
    self.mutableDictionary = [jsDictionary toDictionary]; 
} 

참고 :

같은 것을보십시오. 임의의 시스템 오브젝트를 건네 주면 (자), 그 오브젝트의 재귀 적 변환이 NSDictionary가됩니다.