KAAOptional是Objective-C库,增加了可选支持。
特性
- 轻量级泛型用于内容值
- 字典现在可以在索引方法调用时返回可选值
- 完整的Java 8语法定义(流,控制流程,功能性扩展:map,flatMap,filter)
- Optional的行为与Swift中的optional相同:支持链式调用,如果为空且发 送了未识别的消息则不会崩溃,如果为空且不能响应则崩溃,代理消息到它的值,在相等性上表现一致。
- 支持点符号表示法
- 已测试且文档齐全
用法
控制流程
现在在swift 5.0
func fetch() -> String? {
//Some big work
...
return "123"
}
if let e = fetch() {
print(e)
} else {
//Do something
print("Empty")
}
使用KAAOptional的Objective-C
- (nonnull Optional<NSString *> *)fetch {
//Some big work
...
return Optional.of(@"123");
}
[[self fetch] ifPresent:^(NSNumber * _Nonnull aValue) {
NSLog(@"%@", aValue);
} orElse:^{
NSLog(@"Empty");
}]];
获取功能扩展。
Swift 5.0 现在已有
var res = "404"
if let e = fetch(),
let r = Int(e),
r > 123 {
res = e
}
print(res)
在 Objective-C 中使用 KAAOptional 通过功能扩展实现
- (nonnull Optional<NSString *> *)fetch {
//Some big work
...
return Optional.of(@"123");
}
__auto_type const a = [[[self fetch] filter:^BOOL(NSString * _Nonnull aValue) {
return aValue.integerValue > 123 && [aValue isKindOfClass:[NSString class]];
}] orElse:@"404"];
NSLog(@"%@", a);
或使用 .dot 表示法
__auto_type const b = [self fetch]
.filter(^BOOL(NSString * _Nonnull aValue) {
return aValue.integerValue > 123 && [aValue isKindOfClass:[NSString class]];
}).orElse(@"404");
NSLog(@"%@", b);
支持 Java 8 风格的
- stream
- map
- flatMap
- filter
字典上的下标现在返回 Optional。
Swift 语言中的实现
var a = ["K": "V"]["K"] // Returns Optional
if let a = a { // Unwraps
}
Objective-C 中使用 Optional 的实现
您可以通过在 Dictionary 上调用 "op" 方法来逐点启用它。或者,您可以通过在任何地方调用 "[NSDictionary kaa_enableOptionalByDefault]" 一次来默认启用它。-isEqual
、-isKindOfClass
、-isMemberOfClass
在旧代码中工作正常,调用+class
和+superClass
将返回Optional
和NSObject
。
__auto_type a = @{
@"K": @"V"
}.op;
NSLog(@"%@", a[@"K"]); //-> <Optional: 0xSomeAddress, Value: @"V">
NSLog(@"%@", a[@"wrongKey"]); //-> <Optional: 0xSomeAddress, Value: nil>
注意:以下构造将不会因为内部捕获逻辑而崩溃。因此,您的旧代码是安全的!
[NSDictionary kaa_enableOptionalByDefault];
...
__auto_type a = [@{
@"K": [MyObject new]
}[@"K2"] myOldMessage];
// Will react same as nil messaging
NSLog(@"I didn't crash!");
注意:以下构造将代理到值。因此,它也是安全的!
[NSDictionary kaa_enableOptionalByDefault];
...
NSUInteger i = [@{@"K": @"V"} length];
NSLog(@"%@", @(i)); // Will output = 1
您甚至可以链式使用下标!
__auto_type a = @{
@"K": @[@{@"K2": @"V"}]
};
//By using subscript, you get optional! An it can be chained!
__unused NSString *b = a[@"K"][0][@"K2"].orElse(@"V2");
当然,您可以链式使用 optionals!
NSString *a = Optional.of(Optional.of(@"123")).get;
平等
Swift中使用
var a = ["K": "V"]["K"]
print(a == "V") // true
在Objective-C中使用KAAOptional
[@{@"K": @"V"}.op[@"K"] isEqual:@"K"] // YES
安装
CocoaPods
target '<Your Target Name>' do
pod 'KAAOptional', '~> 1.0.2'
end
Carthage
github "neisip/KAAOptional"
许可协议
KAAOptional采用MIT许可协议发布。有关详细信息,请参阅LICENSE。