Removed unnecessary overhead in RCTConvert functions
This commit is contained in:
parent
1d072076db
commit
0487c55c25
|
@ -17,7 +17,6 @@
|
||||||
#import "RCTLog.h"
|
#import "RCTLog.h"
|
||||||
#import "RCTPointerEvents.h"
|
#import "RCTPointerEvents.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides a collection of conversion functions for mapping
|
* This class provides a collection of conversion functions for mapping
|
||||||
* JSON objects to native types and classes. These are useful when writing
|
* JSON objects to native types and classes. These are useful when writing
|
||||||
|
@ -39,10 +38,11 @@
|
||||||
+ (NSUInteger)NSUInteger:(id)json;
|
+ (NSUInteger)NSUInteger:(id)json;
|
||||||
|
|
||||||
+ (NSArray *)NSArray:(id)json;
|
+ (NSArray *)NSArray:(id)json;
|
||||||
+ (NSSet *)NSSet:(id)json;
|
|
||||||
+ (NSDictionary *)NSDictionary:(id)json;
|
+ (NSDictionary *)NSDictionary:(id)json;
|
||||||
+ (NSString *)NSString:(id)json;
|
+ (NSString *)NSString:(id)json;
|
||||||
+ (NSNumber *)NSNumber:(id)json;
|
+ (NSNumber *)NSNumber:(id)json;
|
||||||
|
|
||||||
|
+ (NSSet *)NSSet:(id)json;
|
||||||
+ (NSData *)NSData:(id)json;
|
+ (NSData *)NSData:(id)json;
|
||||||
+ (NSIndexSet *)NSIndexSet:(id)json;
|
+ (NSIndexSet *)NSIndexSet:(id)json;
|
||||||
|
|
||||||
|
@ -94,6 +94,9 @@ typedef NSURL RCTFileURL;
|
||||||
size:(id)size weight:(id)weight style:(id)style
|
size:(id)size weight:(id)weight style:(id)style
|
||||||
scaleMultiplier:(CGFloat)scaleMultiplier;
|
scaleMultiplier:(CGFloat)scaleMultiplier;
|
||||||
|
|
||||||
|
typedef NSArray NSArrayArray;
|
||||||
|
+ (NSArrayArray *)NSArrayArray:(id)json;
|
||||||
|
|
||||||
typedef NSArray NSStringArray;
|
typedef NSArray NSStringArray;
|
||||||
+ (NSStringArray *)NSStringArray:(id)json;
|
+ (NSStringArray *)NSStringArray:(id)json;
|
||||||
|
|
||||||
|
@ -164,7 +167,6 @@ RCT_CUSTOM_CONVERTER(type, name, [json getter])
|
||||||
#define RCT_CUSTOM_CONVERTER(type, name, code) \
|
#define RCT_CUSTOM_CONVERTER(type, name, code) \
|
||||||
+ (type)name:(id)json \
|
+ (type)name:(id)json \
|
||||||
{ \
|
{ \
|
||||||
json = (json == (id)kCFNull) ? nil : json; \
|
|
||||||
if (!RCT_DEBUG) { \
|
if (!RCT_DEBUG) { \
|
||||||
return code; \
|
return code; \
|
||||||
} else { \
|
} else { \
|
||||||
|
@ -185,7 +187,7 @@ RCT_CUSTOM_CONVERTER(type, name, [json getter])
|
||||||
* detailed error reporting if an invalid value is passed in.
|
* detailed error reporting if an invalid value is passed in.
|
||||||
*/
|
*/
|
||||||
#define RCT_NUMBER_CONVERTER(type, getter) \
|
#define RCT_NUMBER_CONVERTER(type, getter) \
|
||||||
RCT_CUSTOM_CONVERTER(type, type, [[self NSNumber:json] getter])
|
RCT_CUSTOM_CONVERTER(type, type, [RCT_DEBUG ? [self NSNumber:json] : json getter])
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This macro is used for creating converters for enum types.
|
* This macro is used for creating converters for enum types.
|
||||||
|
|
|
@ -29,38 +29,33 @@ RCT_NUMBER_CONVERTER(uint64_t, unsignedLongLongValue);
|
||||||
RCT_NUMBER_CONVERTER(NSInteger, integerValue)
|
RCT_NUMBER_CONVERTER(NSInteger, integerValue)
|
||||||
RCT_NUMBER_CONVERTER(NSUInteger, unsignedIntegerValue)
|
RCT_NUMBER_CONVERTER(NSUInteger, unsignedIntegerValue)
|
||||||
|
|
||||||
RCT_CUSTOM_CONVERTER(NSArray *, NSArray, [NSArray arrayWithArray:json])
|
/**
|
||||||
|
* This macro is used for creating converter functions for directly
|
||||||
|
* representable json values that require no conversion.
|
||||||
|
*/
|
||||||
|
#if RCT_DEBUG
|
||||||
|
#define RCT_JSON_CONVERTER(type) \
|
||||||
|
+ (type *)type:(id)json \
|
||||||
|
{ \
|
||||||
|
if ([json isKindOfClass:[type class]]) { \
|
||||||
|
return json; \
|
||||||
|
} else if (json) { \
|
||||||
|
RCTLogConvertError(json, @#type); \
|
||||||
|
} \
|
||||||
|
return nil; \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define RCT_JSON_CONVERTER(type) \
|
||||||
|
+ (type *)type:(id)json { return json; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RCT_JSON_CONVERTER(NSArray)
|
||||||
|
RCT_JSON_CONVERTER(NSDictionary)
|
||||||
|
RCT_JSON_CONVERTER(NSString)
|
||||||
|
RCT_JSON_CONVERTER(NSNumber)
|
||||||
|
|
||||||
RCT_CUSTOM_CONVERTER(NSSet *, NSSet, [NSSet setWithArray:json])
|
RCT_CUSTOM_CONVERTER(NSSet *, NSSet, [NSSet setWithArray:json])
|
||||||
RCT_CUSTOM_CONVERTER(NSDictionary *, NSDictionary, [NSDictionary dictionaryWithDictionary:json])
|
RCT_CUSTOM_CONVERTER(NSData *, NSData, [json dataUsingEncoding:NSUTF8StringEncoding])
|
||||||
RCT_CONVERTER(NSString *, NSString, description)
|
|
||||||
|
|
||||||
+ (NSNumber *)NSNumber:(id)json
|
|
||||||
{
|
|
||||||
if ([json isKindOfClass:[NSNumber class]]) {
|
|
||||||
return json;
|
|
||||||
} else if ([json isKindOfClass:[NSString class]]) {
|
|
||||||
static NSNumberFormatter *formatter;
|
|
||||||
static dispatch_once_t onceToken;
|
|
||||||
dispatch_once(&onceToken, ^{
|
|
||||||
formatter = [[NSNumberFormatter alloc] init];
|
|
||||||
formatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
|
|
||||||
});
|
|
||||||
NSNumber *number = [formatter numberFromString:json];
|
|
||||||
if (!number) {
|
|
||||||
RCTLogConvertError(json, @"a number");
|
|
||||||
}
|
|
||||||
return number;
|
|
||||||
} else if (json && json != (id)kCFNull) {
|
|
||||||
RCTLogConvertError(json, @"a number");
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSData *)NSData:(id)json
|
|
||||||
{
|
|
||||||
// TODO: should we automatically decode base64 data? Probably not...
|
|
||||||
return [[self NSString:json] dataUsingEncoding:NSUTF8StringEncoding];
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSIndexSet *)NSIndexSet:(id)json
|
+ (NSIndexSet *)NSIndexSet:(id)json
|
||||||
{
|
{
|
||||||
|
@ -79,7 +74,7 @@ RCT_CONVERTER(NSString *, NSString, description)
|
||||||
+ (NSURL *)NSURL:(id)json
|
+ (NSURL *)NSURL:(id)json
|
||||||
{
|
{
|
||||||
NSString *path = [self NSString:json];
|
NSString *path = [self NSString:json];
|
||||||
if (!path.length) {
|
if (!path) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,7 +150,7 @@ RCT_CONVERTER(NSString *, NSString, description)
|
||||||
"Expected format: YYYY-MM-DD'T'HH:mm:ss.sssZ", json);
|
"Expected format: YYYY-MM-DD'T'HH:mm:ss.sssZ", json);
|
||||||
}
|
}
|
||||||
return date;
|
return date;
|
||||||
} else if (json && json != (id)kCFNull) {
|
} else if (json) {
|
||||||
RCTLogConvertError(json, @"a date");
|
RCTLogConvertError(json, @"a date");
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
|
@ -169,7 +164,7 @@ RCT_CUSTOM_CONVERTER(NSTimeZone *, NSTimeZone, [NSTimeZone timeZoneForSecondsFro
|
||||||
|
|
||||||
NSNumber *RCTConvertEnumValue(const char *typeName, NSDictionary *mapping, NSNumber *defaultValue, id json)
|
NSNumber *RCTConvertEnumValue(const char *typeName, NSDictionary *mapping, NSNumber *defaultValue, id json)
|
||||||
{
|
{
|
||||||
if (!json || json == (id)kCFNull) {
|
if (!json) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
if ([json isKindOfClass:[NSNumber class]]) {
|
if ([json isKindOfClass:[NSNumber class]]) {
|
||||||
|
@ -180,13 +175,12 @@ NSNumber *RCTConvertEnumValue(const char *typeName, NSDictionary *mapping, NSNum
|
||||||
RCTLogError(@"Invalid %s '%@'. should be one of: %@", typeName, json, allValues);
|
RCTLogError(@"Invalid %s '%@'. should be one of: %@", typeName, json, allValues);
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
if (RCT_DEBUG && ![json isKindOfClass:[NSString class]]) {
|
||||||
if (![json isKindOfClass:[NSString class]]) {
|
|
||||||
RCTLogError(@"Expected NSNumber or NSString for %s, received %@: %@",
|
RCTLogError(@"Expected NSNumber or NSString for %s, received %@: %@",
|
||||||
typeName, [json classForCoder], json);
|
typeName, [json classForCoder], json);
|
||||||
}
|
}
|
||||||
id value = mapping[json];
|
id value = mapping[json];
|
||||||
if (!value && [json description].length > 0) {
|
if (RCT_DEBUG && !value && [json description].length > 0) {
|
||||||
RCTLogError(@"Invalid %s '%@'. should be one of: %@", typeName, json, [[mapping allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)]);
|
RCTLogError(@"Invalid %s '%@'. should be one of: %@", typeName, json, [[mapping allKeys] sortedArrayUsingSelector: @selector(caseInsensitiveCompare:)]);
|
||||||
}
|
}
|
||||||
return value ?: defaultValue;
|
return value ?: defaultValue;
|
||||||
|
@ -332,7 +326,7 @@ static void RCTConvertCGStructValue(const char *type, NSArray *fields, NSDiction
|
||||||
for (NSUInteger i = 0; i < count; i++) {
|
for (NSUInteger i = 0; i < count; i++) {
|
||||||
result[i] = [RCTConvert CGFloat:json[fields[i]]];
|
result[i] = [RCTConvert CGFloat:json[fields[i]]];
|
||||||
}
|
}
|
||||||
} else if (RCT_DEBUG && json && json != (id)kCFNull) {
|
} else if (json) {
|
||||||
RCTLogConvertError(json, @(type));
|
RCTLogConvertError(json, @(type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -619,8 +613,7 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[
|
||||||
blue:[self CGFloat:json[@"b"]]
|
blue:[self CGFloat:json[@"b"]]
|
||||||
alpha:[self CGFloat:json[@"a"] ?: @1]];
|
alpha:[self CGFloat:json[@"a"] ?: @1]];
|
||||||
|
|
||||||
}
|
} else if (json) {
|
||||||
else if (RCT_DEBUG && json && json != (id)kCFNull) {
|
|
||||||
RCTLogConvertError(json, @"a color");
|
RCTLogConvertError(json, @"a color");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -646,7 +639,7 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[
|
||||||
// TODO: we might as well cache the result of these checks (and possibly the
|
// TODO: we might as well cache the result of these checks (and possibly the
|
||||||
// image itself) so as to reduce overhead on subsequent checks of the same input
|
// image itself) so as to reduce overhead on subsequent checks of the same input
|
||||||
|
|
||||||
if (!json || json == (id)kCFNull) {
|
if (!json) {
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -933,13 +926,25 @@ NSArray *RCTConvertArrayValue(SEL type, id json)
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
RCT_ARRAY_CONVERTER(NSString)
|
|
||||||
RCT_ARRAY_CONVERTER(NSDictionary)
|
|
||||||
RCT_ARRAY_CONVERTER(NSURL)
|
RCT_ARRAY_CONVERTER(NSURL)
|
||||||
RCT_ARRAY_CONVERTER(RCTFileURL)
|
RCT_ARRAY_CONVERTER(RCTFileURL)
|
||||||
RCT_ARRAY_CONVERTER(NSNumber)
|
|
||||||
RCT_ARRAY_CONVERTER(UIColor)
|
RCT_ARRAY_CONVERTER(UIColor)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This macro is used for creating converter functions for directly
|
||||||
|
* representable json array values that require no conversion.
|
||||||
|
*/
|
||||||
|
#if RCT_DEBUG
|
||||||
|
#define RCT_JSON_ARRAY_CONVERTER(type) RCT_ARRAY_CONVERTER(type)
|
||||||
|
#else
|
||||||
|
#define RCT_JSON_ARRAY_CONVERTER(type) + (NSArray *)type##Array:(id)json { return json; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
RCT_JSON_ARRAY_CONVERTER(NSArray)
|
||||||
|
RCT_JSON_ARRAY_CONVERTER(NSString)
|
||||||
|
RCT_JSON_ARRAY_CONVERTER(NSDictionary)
|
||||||
|
RCT_JSON_ARRAY_CONVERTER(NSNumber)
|
||||||
|
|
||||||
// Can't use RCT_ARRAY_CONVERTER due to bridged cast
|
// Can't use RCT_ARRAY_CONVERTER due to bridged cast
|
||||||
+ (NSArray *)CGColorArray:(id)json
|
+ (NSArray *)CGColorArray:(id)json
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue