簡體   English   中英

不能快速使用Objective-c塊

[英]Can not use Objective-c block in swift

我已在我的Objective-C代碼中減速了此block

typedef void(^ActionStringDoneBlock)(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue);
typedef void(^ActionStringCancelBlock)(ActionSheetStringPicker *picker);

我在Objective-C中減速了這個block的實例,如下所示:

ActionStringDoneBlock done = ^(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue) {
    selectedVisa = (int) selectedIndex;
    if ([visaView.textField respondsToSelector:@selector(setText:)]) {
        [visaView.textField performSelector:@selector(setText:) withObject:selectedValue];
    }
};

並使用如下所示的實例:

    [ActionSheetStringPicker showPickerWithTitle:"myTitle"
                                        rows:visaData
                            initialSelection:initialSelection
                                   doneBlock:done
                                 cancelBlock:cancel
                                      origin:visaView.textField
 ];

我的項目用戶同時使用swift和Objective-C代碼。 現在,我想在我的Swift代碼的新ViewController中使用這些代碼。 我使用下面的代碼:

let done = {(picker: ActionSheetStringPicker?, selectedIndex:Int, selectedValue: Any?)  in

    //My Codes

    }

    let cancel  = {
        (_ picker: ActionSheetStringPicker) -> Void in

    }

    ActionSheetStringPicker.show(withTitle: "My Title",
                                 rows: messageTitleData,
                                 initialSelection: initialSelection,
                                 doneBlock: done as ActionStringDoneBlock,
                                 cancel: cancel as! ActionStringCancelBlock,
                                 origin: messageTitle.textField
    )

但是我在快速代碼中得到以下錯誤:

EXC_BREAKPOINT

我已經將done as ActionStringDoneBlock打印到控制台,我看到以下結果:

錯誤::3:1:錯誤:無法強制轉換類型'()->()'的值到類型'ActionStringDoneBlock'(aka'(Optional,Int,Optional)->()')

我也嘗試定義done ,如下所示:

  let done = {(picker: Optional<ActionSheetStringPicker>, selectedIndex:Int, selectedValue: Optional<Any>)  in

    //My Codes

    }

但是又遇到了同樣的錯誤。 有人對快速代碼中的問題有任何想法嗎?

您需要注釋閉包類型並忽略傳遞的類型

let done : ActionStringDoneBlock  = { (picker, selectedIndex, selectedValue)  in ... }

let cancel : ActionStringCancelBlock = { picker in ... }

沒有注釋的閉包將被視為() -> () 這就是錯誤消息的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM