如何在Objective-C中实现链式语法?

浏览:46日期:2023-12-16

问题描述

如何在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)

有更好的看法或者想法,讨论继续 :]

相关文章: