KAAOptional 1.0.2

KAAOptional 1.0.2

neisip维护。



  • Alexander Kazartsev

KAAOptional: Optionals for Objective C

Build status Code coverage status CocoaPods Carthage

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]" 一次来默认启用它。⚠️⚠️⚠️ 注意 - 尽管Optional的行为像代理:-isEqual-isKindOfClass-isMemberOfClass在旧代码中工作正常,调用+class+superClass将返回OptionalNSObject

__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