1

verwendet Ich habe abgebremst diesen block s in meinem Objective-C-Code:Kann nicht Objective-C-Block in schnellen

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

ich abbremsen eine Instanz dieses block s in Objective-C wie unten:

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

und verwenden diese Instanz wie folgt:

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

Meine Projektnutzer sowohl schnelle und objecti V-Code. Jetzt möchte ich diesen Code in einem neuen ViewController in meinem Swift-Code verwenden. Ich benutze folgenden Code:

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 
    ) 

aber ich unten Fehlermeldung erhalten in SWIFT-Code:

EXC_BREAKPOINT

ich das aus done as ActionStringDoneBlock auf die Konsole setzen gedruckt hatte ein I siehe unten Ergebnis:

error: :3:1: error: cannot convert value of type '() ->()' to type 'ActionStringDoneBlock' (aka '(Optional, Int, Optional) ->()') in coercion

Ich habe auch versucht, done wie folgt zu definieren:

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

    //My Codes 

    } 

aber wieder denselben Fehler bekommen. Hat jemand eine Vorstellung davon, was das Problem im schnellen Code ist?

Antwort

3

Sie müssen die Verschlusstypen und lassen die übergebenen Typen

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

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

Ohne eine Anmerkung beschriften eine Schließung als () ->() behandelt wird. Das sagt die Fehlermeldung.