如何在Objective-C中实现链式语法?
例如:
someObject.a.and.b.someMethod(5)
这里主要指的是点链式语法,不同于常见的[[[[someObject a] and] b] someMethod:5] 中括号链式语法。
[[[[someObject a] and] b] someMethod:5]
如何设计?
欢迎选择我的课程,让我们一起见证您的进步~~
通过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) { //code if (enable) { NSLog(@"ClassA yes"); } else { NSLog(@"ClassA no"); } return self; } } - (ClassA *(^)(NSString *))bbb { return ^(NSString *str)) { //code NSLog(@"%@", 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) { //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; } } // At last, we can do it like this------------------------------------------ id a = [ClassA new]; a.aaa(YES).bbb(@"HelloWorld!").ccc(@"Objective-C").ddd(NO)
有更好的看法或者想法,讨论继续 :]
通过Stackoverflow已经解决了这个问题。链接地址:http://stackoverflow.com/questions/27739106/how-to-implement-chainable-syntax-with-objective-c/27740550#27740550
示例:
有更好的看法或者想法,讨论继续 :]