OC 체인 프로그래밍의 실천

2663 단어
이른바 체인 프로그래밍이란 기본적으로 하나의 방법을 호출할 때 대상 자체를 되돌려주고 방법을 계속 호출할 수 있는 것이다.OC의 경우
@interface Person : NSObject

- (Person *)eat:(NSString *)food;
- (Person *)drink:(NSString *)water;
- (Person *)sleep:(NSInteger)hour;

@property (nonatomic, weak, readonly) Person *(^makeFriend)(NSString *name);
@property (nonatomic, weak, readonly) Person *(^learn)(NSString *name);

@end
#import "Person.h"

@implementation Person

- (Person *)eat:(NSString *)food {
    NSLog(@"eat %@", food);
    return self;
}

- (Person *)drink:(NSString *)water {
    NSLog(@"drink: %@", water);
    return self;
}

- (Person *)sleep:(NSInteger)hour {
    NSLog(@"sleep: %ld hours", (long)hour);
    return self;
}

- (Person * _Nullable (^)(NSString * _Nonnull))makeFriend {
    return ^Person *(NSString *name) {
        NSLog(@"make friend: %@", name);
        return self;
    };
}

- (Person * _Nullable (^)(NSString * _Nonnull))learn {
    return ^Person *(NSString *name) {
        NSLog(@"learn: %@", name);
        return self;
    };
}

@end
#import 
#import "Person.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p = Person.new;
        [[[p eat:@" "] drink:@" "] sleep:3].learn(@" ").makeFriend(@" ");
    }
    return 0;
}

그러나 OC는 중괄호 호출 방식의 체인 프로그래밍을 사용하여 쓰기가 문법보다 편하지 않다.밑바닥에서 체인 프로그래밍을 지원하는 언어는 Fluuter의Dart 언어로 직접 obj..method1()..method2().. 이며, 이것은 언어의 밑바닥에서 직접 지원합니다.이런 코드를 쓰면 Swift가 OC보다 우세하다.
우리는 이런 문법이 무엇을 할 수 있는지 알고 있습니까?Masonry는 바로 이런 사상을 이용하여 한 것이다.실제 업무에서 제 업무 경력 중 하나는 프로젝트에서 사용하는 것은 모두 OC입니다. 보기에 속성을 부여할 때 흔히 다음과 같습니다.
UIView *view = UIView.new;
view.backgroudColor = ...
view.frame = ..
...

당시에 나는 체인식 사상으로 글씨를 간략하게 쓸 수 있는지 생각했다. 설령 문법 사탕일지라도 여전히 재미있는 일이라고 생각해서 반나절의 시간을 들여 썼다. 그러나 OC가 범형에 대한 지원이 철저하지 않기 때문에 OC로 쓸 때 약간의 손발을 했고 마지막에 코드를 다음과 같이 조정했다.
- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view addSubview:UIButton.new
     .dl_frame(CGRectMake(0, 0, 100, 100))
     .dl_backgroundColor(UIColor.redColor)
     .dl_titleColorForState(UIColor.whiteColor, UIControlStateNormal)
     .dl_titleForState(@"Click me", UIControlStateNormal)
     .dl_center(self.view.center)
     .dl_cornerRadius(8)
     .dl_clipsToBounds(YES)
     .dl_addTargetAction(self, @selector(buttonClick:), UIControlEventTouchUpInside)];
}

저는 여기 제 이름으로'대유dl '접두사와 시스템 방법으로 구분하다.여기는 원본 코드 대실현입니다.
https://github.com/ACommonChinese/OCLinkSetProperty

좋은 웹페이지 즐겨찾기