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
'programing' 카테고리의 다른 글
| 새로운 로컬 브랜치를 리모트 Git 저장소에 푸시하고 추적하려면 어떻게 해야 하나요? (0) | 2023.04.16 |
|---|---|
| Windows 레지스트리의 환경변수는 어디에 저장되어 있습니까? (0) | 2023.04.16 |
| 창의 설계 시간 DataContext를 설정하면 컴파일러 오류가 발생합니까? (0) | 2023.04.11 |
| 스크립트의 소스 여부를 검출하는 방법 (0) | 2023.04.11 |
| std:: 문자열에서 char* (0) | 2023.04.11 |