Objective-Shorthand是一组Foundation对象的分类,用于让Objective-C中的长代码变得简单。鼓励添加扩展。
使用 Cocoapods 获取 Objective-Shorthand
pod 'Objective-Shorthand', '~> 1.0'
Objective-Shorthand简化了代码,以便检查正则表达式是否与字符串匹配,从以下代码
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regex options:0 error:nil];
NSUInteger numberOfMatches = [regularExpression numberOfMatchesInString:self options:0 range:NSMakeRange(0, self.length)];
BOOL doesMatch = numberOfMatches > 0;
到
BOOL doesMatch = [string matchesRegex:regex];
还包括一个方法来找到给定正则表达式第一次匹配的范围
- (NSRange) rangeOfFirstSubstringMatching:(NSString*)regex;
使用NSJSONSerialization
,您在反序列化为数组和字典之前需要将字符串转换为NSData
。Objective-Shorthand简化了这一切。
它提供了与JSONKit
相同的接口,但在后台使用内置的Apple JSON序列化器。Ruby社区擅长编写具有一致接口的库,这是Objective-C编写者需要借鉴的。
将JSON字符串转换为NSArray
或NSDictionary
- (id) objectFromJSONString;
并将数组或字典转换为NSString
- (NSString *)JSONString;
OS X SDK有一个称为NSComparisonMethods
的奇怪API。基本上,这个API围绕compare:
提供包装并使用它定义了以下方法
- (BOOL)isEqualTo:(id)object;
- (BOOL)isLessThanOrEqualTo:(id)object;
- (BOOL)isLessThan:(id)object;
- (BOOL)isGreaterThanOrEqualTo:(id)object;
- (BOOL)isGreaterThan:(id)object;
- (BOOL)isNotEqualTo:(id)object;
由于某种原因,这些方法从未应用到iOS上,尽管它们非常有用。我喜欢这些方法,因为它们的语义比普通的compare:
方法强。与[object compare:otherObject] == NSOrderedDescending
相比,[object isGreaterThan:otherObject]
更容易理解。
如果相关的对象没有响应compare:
,将会抛出异常。
NSDataDetector
有时可能难以处理。Objective-Shorthand将复杂的NSDataDetector
对象简化为NSString上的单行代码
- (BOOL) isEmail;
- (BOOL) isURL;
- (BOOL) isPhoneNumber;
- (BOOL) isDate;
- (BOOL) isAddress;
从数组中提取独特元素涉及始终让人困惑的[array valueForKeyPath:@"@distinctUnionOfObjects.self"]
。这被封装在内的方法中
- (NSArray*) uniquedArray;
从此不再需要记住如何输入这个字面量字符串!自动补全规则无处不在。
还有一个-sortedArray
,它使用默认的compare:
选择器来比较对象
- (NSArray*) sortedArray;
Objective-Shorthand 还包括 -reversedArray
和 -flattenedArray
。
最后,Objective-Shorthand 为NSArray
提供了一个类别,该类别提供了常规功能集合运算符,如map
、select
和any
,但名称既有语义性又更符合 Objective-C 风格。
each
已在 Foundation 中定义,因此不包括在内。
- (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block;
其他运算符也可以找到,包括select
(也称为filter
)和reject
。
- (NSArray*) arrayBySelectingObjectsPassingTest:(BOOL (^)(id object))test;
- (NSArray*) arrayByRejectingObjectsPassingTest:(BOOL (^)(id object))test;
map
(也称为collect
)和reduce
(也称为inject
)也可用。
- (NSArray*) arrayByTransformingObjectsUsingBlock:(id (^)(id object))block;
- (id) objectByReducingObjectsIntoAccumulator:(id)accumulator usingBlock:(id (^)(id accumulator, id object))block;
还有 sample
和 match
可用。
- (id) firstObjectPassingTest:(BOOL (^)(id object))test;
- (id) randomObject;
最后,还有一些布尔运算符
- (BOOL) allObjectsPassTest:(BOOL (^)(id object))test;
- (BOOL) anyObjectsPassTest:(BOOL (^)(id object))test;
- (BOOL) noObjectsPassTest:(BOOL (^)(id object))test;
上述所有方法也适用于 NSSet
和 NSDictionary
。
感谢@bgottlob,Objective-Shorthand还有一些字符串函数。
- (BOOL)contains:(NSString *)testString
- (BOOL)isEqualToStringIgnoringCase:(NSString *)otherString
- (NSString *)stringByRemovingOccurrencesOfString:(NSString *)removeString
每次我需要将NSString
转换为NSData
时,都必须检查Stack Overflow。再也不会了!
现在NSString
有-dataRepresentation
,而NSData
有-stringRepresentation
。
欢迎提交拉取请求,但是,每个方法都有一个测试套件和 AppleDoc 遵守的文档。请确保您没有破坏测试,并且如果您添加了新方法,请确保已对其进行了测试覆盖,并包含了相关文档。
如果您有任何问题、评论或建议,请与我联系。您可以在@khanlou上找到我,电子邮件地址为[email protected]。