问题描述
如何在Objective-C中实现链式语法?
例如:
someObject.a.and.b.someMethod(5)
这里主要指的是点链式语法,不同于常见的[[[[someObject a] and] b] someMethod:5] 中括号链式语法。
如何设计?
问题解答
回答1:通过Stackoverflow已经解决了这个问题。链接地址:http://stackoverflow.com/questions/27739106/how-to-implement-chainable-syntax-with-objective-c/27740550#27740550
示例:
@class ClassB;@interface ClassA : NSObject//1. we define some the block properties@property(nonatomic, readonly) ClassA *(^aaa)(BOOL enable);@property(nonatomic, readonly) ClassA *(^bbb)(NSString* str);@property(nonatomic, readonly) ClassB *(^ccc)(NSString* str);@implement ClassA//2. we implement these blocks, and remember the type of return value, it’s important to chain next block- (ClassA *(^)(BOOL))aaa{ return ^(BOOL enable) {//codeif (enable) { NSLog(@'ClassA yes');} else { NSLog(@'ClassA no');}return self; }}- (ClassA *(^)(NSString *))bbb{ return ^(NSString *str)) {//codeNSLog(@'%@', str);return self; }}// Here returns a instance which is kind of ClassB, then we can chain ClassB’s block.// See below .ccc(@'Objective-C').ddd(NO)- (ClassB * (^)(NSString *))ccc{ return ^(NSString *str) {//codeNSLog(@'%@', 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) {//codeif (enable) { NSLog(@'ClassB yes');} else { NSLog(@'ClassB no');}return self; }}// At last, we can do it like this------------------------------------------id a = [ClassA new];a.aaa(YES).bbb(@'HelloWorld!').ccc(@'Objective-C').ddd(NO)
有更好的看法或者想法,讨论继续 :]