programing

Swift에서 닫힘을 변수로 저장

mbctv 2023. 4. 11. 22:31
반응형

Swift에서 닫힘을 변수로 저장

Objective-C에서 블록의 입력과 출력을 정의하고 메서드에 전달된 블록 중 하나를 저장한 후 나중에 해당 블록을 사용할 수 있습니다.

// in .h

    typedef void (^APLCalibrationProgressHandler)(float percentComplete);
    typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error);

    // in .m

    @property (strong) APLCalibrationProgressHandler progressHandler;
    @property (strong) APLCalibrationCompletionHandler completionHandler;

    - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler
    {
        self = [super init];
        if(self)
        {
            ...
            _completionHandler = [handler copy];
            ..
        }

        return self;
}

- (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler
{
    ...

            self.progressHandler = [handler copy];

     ...
            dispatch_async(dispatch_get_main_queue(), ^{
                _completionHandler(0, error);
            });
     ...
}

그래서 스위프트로 등분법을 쓰려고 합니다.

var completionHandler:(Float)->Void={}


init() {
    locationManager = CLLocationManager()
    region = CLBeaconRegion()
    timer = NSTimer()
}

convenience init(region: CLBeaconRegion, handler:((Float)->Void)) {
    self.init()
    locationManager.delegate = self
    self.region = region
    completionHandler = handler
    rangedBeacons = NSMutableArray()
}

컴파일러는 그 완료 선언을 좋아하지 않습니다.탓은 아니지만, 나중에 Swift에서 설정 및 사용할 수 있는 클로저를 어떻게 정의해야 합니까?

컴파일러가 불평한다.

var completionHandler: (Float)->Void = {}

오른쪽이 적절한 서명의 폐쇄가 아니기 때문에, 즉 플로트 인수를 사용하는 폐쇄가 아닙니다.다음은 완료 핸들러에 "아무것도 하지 않음" 닫힘을 할당합니다.

var completionHandler: (Float)->Void = {
    (arg: Float) -> Void in
}

줄여서 말하면

var completionHandler: (Float)->Void = { arg in }

자동 유형 추론 때문입니다.

그러나 당신이 원하는 것은 완료 핸들러가 다음과 같이 초기화되는 것입니다.nilObjective-C 인스턴스 변수가 초기화되는 것과 같은 방법으로nilSwift 에서는, 다음의 옵션을 사용해 이것을 실현할 수 있습니다.

var completionHandler: ((Float)->Void)?

이제 속성이 자동으로 초기화됩니다.nil("값 없음")Swift에서는 옵션바인딩을 사용하여 완료 핸들러가 값을 가지고 있는지 확인합니다.

if let handler = completionHandler {
    handler(result)
}

또는 체인(옵션):

completionHandler?(result)

목표-C

@interface PopupView : UIView
@property (nonatomic, copy) void (^onHideComplete)();
@end

@interface PopupView ()

...

- (IBAction)hideButtonDidTouch:(id sender) {
    // Do something
    ...
    // Callback
    if (onHideComplete) onHideComplete ();
}

@end

PopupView * popupView = [[PopupView alloc] init]
popupView.onHideComplete = ^() {
    ...
}

재빠르다

class PopupView: UIView {
    var onHideComplete: (() -> Void)?

    @IBAction func hideButtonDidTouch(sender: AnyObject) {
        // Do something
        ....
        // Callback
        if let callback = self.onHideComplete {
            callback ()
        }
    }
}

var popupView = PopupView ()
popupView.onHideComplete = {
    () -> Void in 
    ...
}

이게 당신이 원하는 것인지 확신할 수 없는 예를 제시했습니다.

var completionHandler: (_ value: Float) -> ()

func printFloat(value: Float) {
    print(value)
}

completionHandler = printFloat

completionHandler(5)

5를 인쇄하려면completionHandler변수가 선언되었습니다.

폐쇄는 다음과 같이 선언할 수 있습니다.typealias아래와 같이

typealias Completion = (Bool, Any, Error) -> Void

코드의 어디에나 함수에서 사용하고 싶은 경우는, 통상의 변수와 같이 쓸 수 있습니다.

func xyz(with param1: String, completion: Completion) {
}

스위프트 4와 5에.두 개의 매개 변수 사전과 bool을 포함하는 폐쇄 변수를 만들었습니다.

 var completionHandler:([String:Any], Bool)->Void = { dict, success  in
    if success {
      print(dict)
    }
  }

닫힘 변수 호출

self.completionHandler(["name":"Gurjinder singh"],true)

이것도 동작합니다.

var exeBlk = {
    () -> Void in
}
exeBlk = {
    //do something
}
//instead of nil:
exeBlk = {}

고객의 요구에 따라서는, 받아들여지는 회답에 추가가 있습니다.다음과 같이 구현할 수도 있습니다.

var parseCompletion: (() ->Void)!

나중에 어떤 함수에 할당되어

func someHavyFunc(completion: @escaping () -> Void){
    self.parseCompletion = completion
}

그리고 어떤 두 번째 기능에서 그것을 사용한다.

func someSecondFunc(){
    if let completion = self.parseCompletion {
        completion()
    }
}

을 주목하다@escaping여기서 파라미터는필수입니다.

저에게는 다음과 같은 것이 효과가 있었습니다.

var completionHandler:((Float)->Void)!

언급URL : https://stackoverflow.com/questions/24603559/store-a-closure-as-a-variable-in-swift

반응형