美文网首页
利用block实现简单链式语法

利用block实现简单链式语法

作者: 骄阳Niki | 来源:发表于2016-05-19 20:10 被阅读88次

接触到Masonry这一框架后 被它内部简洁明了的链式语法所惊艳到 瞬间链式语法就像神奇的魔法棒 通过一行链式语言就实现了自动布局 而且完全增加了可读性 是不是很神奇

先上一段代码膜拜一下

UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);

[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
    make.left.equalTo(superview.mas_left).with.offset(padding.left);
    make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
    make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];

不由自主就会想到一个问题 如何在Objective-C中实现链式语法呢

粗略地了解了一下 原来链式语法有中括号链式语法和点链式语法的区别

中括号链式语法 例如 :
[[[[someObj method1] method2] method3] method4:someParam]
每个方法的返回值是下一个方法的发送者 这样就实现了多个方法连续执行

下面简单对点链式语法做了一个小的练习 不多说 上代码


@class ClassB;
@interface ClassA : NSObject
 
// 1. 定义一些 block 属性
@property(nonatomic, readonly) ClassA *(^aaa)(BOOL enable);
@property(nonatomic, readonly) ClassA *(^bbb)(NSString * str);
@property(nonatomic, readonly) ClassB *(^ccc)(NSString * str);
 
@implement ClassA
 
// 2. 实现这些 block 方法,block 返回值类型很关键,影响着下一个链式
- (ClassA *(^)(BOOL))aaa
{
    return ^(BOOL enable) {
        //code
        if (enable) {
            NSLog(@"ClassA yes");
        } else {
            NSLog(@"ClassA NO");
        }
        return self;
    }
}
 
- (ClassA * (^)(NSString *))bbb
{
    return ^(NSString *str)) {
        //code
        NSLog(@"%@", str);
        return self;
    }
}
 
 
// 这里返回了ClassB的一个实例,于是后面就可以继续链式 ClassB 的 block 方法
// 见下面例子 .ccc(@"Objective-C").ddd(NO)
- (ClassB * (^)(NSString *))ccc
{
    return ^(NSString *str) {
        //code
        NSLog(@"%@", str);
        ClassB *b = [[ClassB alloc] initWithString:ccc];
        return b;
    }
}
 
//------------------------------------------
@interface ClassB : NSObject
@property(nonatomic, readonly) ClassB *(^ddd)(BOOL enable);
 
- (id)initWithString:(NSString *)str;
 
@implement ClassB
 
- (ClassB *(^)(BOOL))ddd
{
    return ^(BOOL enable) {
        //code
        if (enable) {
            NSLog(@"ClassB yes");
        } else {
            NSLog(@"ClassB no");
        }
        return self;
    }
}
 
// 最后我们可以这样做
id a = [ClassA new];
a.aaa(YES).bbb(@"HelloWorld!").ccc(@"Objective-C").ddd(NO)

这样就简单在Objective-C地实现了链式语法 不过不得不说 block有时候还真是一个利器

相关文章

  • 利用block实现简单链式语法

    接触到Masonry这一框架后 被它内部简洁明了的链式语法所惊艳到 瞬间链式语法就像神奇的魔法棒 通过一行链式语...

  • 给链式语法泼点冷水

    引言 最近基于block实现的链式语法很火, 不管大牛还是新手, 都搞出好多链式语法的库或者blog介绍。曾经有一...

  • 利用Block实现链式编程

    1、Person的方法 2、执行代码 总结:

  • 利用block实现链式编程

    虽然链式编程很少见,但是某些场合下,如果能够巧妙利用block 实现链式编程的话,不仅会提高开发效率,而且代码很清...

  • iOS链式调用的简单实现

    利用方法返回一个Block(这个Block内部返回self)来实现方法的链式调用。 栗子?: 代码分析: 首先调用...

  • Objective-C实现链式编程语法(DSL)

    Objective-C实现链式编程语法(DSL) Objective-C实现链式编程语法(DSL)

  • iOS链式函数式响应式编程

    iOS链式,函数式,响应式编程 block表达式语法: 作为函数参数的语法 定义block简写 作为返回值的语法 ...

  • iOS-链式编程思想

    在iOS中,链式编程虽然用的不太多,但是,在特定的应用环境下,利用block实现链式编程的话,会大大的提高编程效率...

  • iOS链式编程

    在iOS中,链式编程虽然用的不太多,但是,在特定的应用环境下,利用block实现链式编程的话,会大大的提高编程效率...

  • OC-链式编程

    原理:用block作为返回值实现的链式 优点通过点语法直接调用 缺点虽然点语法调出方法,但是()和括号内的值需要手...

网友评论

      本文标题:利用block实现简单链式语法

      本文链接:https://www.haomeiwen.com/subject/jiugrttx.html