Не может использовать блок Objective-C в Swift
Я замедлил это block
s в моем коде объектива-C:
typedef void(^ActionStringDoneBlock)(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue);
typedef void(^ActionStringCancelBlock)(ActionSheetStringPicker *picker);
Я замедляю случай этого block
s в объективе-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 ... }
Без аннотации закрытие рассматривается как () -> ()
, Вот что говорится в сообщении об ошибке.