Не может использовать блок Objective-C в Swift

Я замедлил это blocks в моем коде объектива-C:

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

Я замедляю случай этого blocks в объективе-c, как показано ниже:

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
 ];

Мой проект использует как быстрый, так и объективный код. Теперь я хочу использовать этот код в новом 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 '(необязательно, Int, необязательно) -> ()') при принуждении

Я также попытался определить done как показано ниже:

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

    //My Codes

    }

но снова получил ту же ошибку. Кто-нибудь имеет представление о том, в чем проблема в быстром коде?

1 ответ

Решение

Вы должны аннотировать закрывающие типы и пропустить пропущенные типы

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

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

Без аннотации закрытие рассматривается как () -> (), Вот что говорится в сообщении об ошибке.

Другие вопросы по тегам