版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.03.20 |
前言
iOS圈内有几个人大家基本都知道,比如说王巍、唐巧,还有YYKit框架的作者现任职于滴滴的郭曜源 - ibireme等。这里有一篇唐巧对他的专访,还有他的 GitHub - Yaoyuan 和 博客,这里贴出来框架YYKit 框架。接下来几篇我们就一起来看一下这个框架。感兴趣的可以看上面写的几篇。
1. YYKit源码探究(一) —— 基本概览
2. YYKit源码探究(二) —— NSString分类之Hash(一)
3. YYKit源码探究(三) —— NSString分类之Encode and decode(二)
4. YYKit源码探究(四) —— NSString分类之Drawing(三)
5. YYKit源码探究(五) —— NSString分类之Regular Expression(四)
回顾
上一篇我们分析了NSString
分类NSString+YYAdd
的Regular Expression
部分,这一篇我们就看一下NSNumber Compatible
部分。
API 接口
// Now you can use NSString as a NSNumber.
@property (readonly) char charValue;
@property (readonly) unsigned char unsignedCharValue;
@property (readonly) short shortValue;
@property (readonly) unsigned short unsignedShortValue;
@property (readonly) unsigned int unsignedIntValue;
@property (readonly) long longValue;
@property (readonly) unsigned long unsignedLongValue;
@property (readonly) unsigned long long unsignedLongLongValue;
@property (readonly) NSUInteger unsignedIntegerValue;
示例调用
下面我们看一下方法的示例调用。
NSString *str = @"1234567890";
long value = [str longValue];
NSLog(@"值为 = %ld", value);
下面看一下输出结果
2018-03-19 12:21:56.577709+0800 JJWebImage[29164:4134580] 值为 = 1234567890
方法实现
下面我们就看一下方法实现
- (char)charValue {
return self.numberValue.charValue;
}
- (unsigned char) unsignedCharValue {
return self.numberValue.unsignedCharValue;
}
- (short) shortValue {
return self.numberValue.shortValue;
}
- (unsigned short) unsignedShortValue {
return self.numberValue.unsignedShortValue;
}
- (unsigned int) unsignedIntValue {
return self.numberValue.unsignedIntValue;
}
- (long) longValue {
return self.numberValue.longValue;
}
- (unsigned long) unsignedLongValue {
return self.numberValue.unsignedLongValue;
}
- (unsigned long long) unsignedLongLongValue {
return self.numberValue.unsignedLongLongValue;
}
- (NSUInteger) unsignedIntegerValue {
return self.numberValue.unsignedIntegerValue;
}
- (NSNumber *)numberValue {
return [NSNumber numberWithString:self];
}
下面就是进入NSNumber的分类进行了处理。
+ (NSNumber *)numberWithString:(NSString *)string {
NSString *str = [[string stringByTrim] lowercaseString];
if (!str || !str.length) {
return nil;
}
static NSDictionary *dic;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dic = @{@"true" : @(YES),
@"yes" : @(YES),
@"false" : @(NO),
@"no" : @(NO),
@"nil" : [NSNull null],
@"null" : [NSNull null],
@"<null>" : [NSNull null]};
});
id num = dic[str];
if (num) {
if (num == [NSNull null]) return nil;
return num;
}
// hex number
int sign = 0;
if ([str hasPrefix:@"0x"]) sign = 1;
else if ([str hasPrefix:@"-0x"]) sign = -1;
if (sign != 0) {
NSScanner *scan = [NSScanner scannerWithString:str];
unsigned num = -1;
BOOL suc = [scan scanHexInt:&num];
if (suc)
return [NSNumber numberWithLong:((long)num * sign)];
else
return nil;
}
// normal number
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
return [formatter numberFromString:string];
}
后记
本篇我们分析了NSNumber Compatible部分的功能,主要就是兼容NSNumber数据类型,喜欢的给个赞~~~