不能在 swift 中使用 Objective-c 块
Can not use Objective-c block in swift
我已经在我的 objective-c 代码中减速了 block
s:
typedef void(^ActionStringDoneBlock)(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue);
typedef void(^ActionStringCancelBlock)(ActionSheetStringPicker *picker);
我在 objective-c 中减速这个 block
s 的一个实例,如下所示:
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
)
但我在 swift 代码中遇到以下错误:
EXC_BREAKPOINT
我已将 done as ActionStringDoneBlock
的输出打印到控制台,我看到以下结果:
error: :3:1: error: cannot convert value of type '() -> ()' to type 'ActionStringDoneBlock' (aka '(Optional, Int, Optional) -> ()') in coercion
我也试过定义 done
如下:
let done = {(picker: Optional<ActionSheetStringPicker>, selectedIndex:Int, selectedValue: Optional<Any>) in
//My Codes
}
但又遇到同样的错误。有人知道 swift 代码中的问题是什么吗?
您需要注释闭包类型并省略传递的类型
let done : ActionStringDoneBlock = { (picker, selectedIndex, selectedValue) in ... }
let cancel : ActionStringCancelBlock = { picker in ... }
如果没有注释,闭包将被视为 () -> ()
。这就是错误消息所说的。
我已经在我的 objective-c 代码中减速了 block
s:
typedef void(^ActionStringDoneBlock)(ActionSheetStringPicker *picker, NSInteger selectedIndex, id selectedValue);
typedef void(^ActionStringCancelBlock)(ActionSheetStringPicker *picker);
我在 objective-c 中减速这个 block
s 的一个实例,如下所示:
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
)
但我在 swift 代码中遇到以下错误:
EXC_BREAKPOINT
我已将 done as ActionStringDoneBlock
的输出打印到控制台,我看到以下结果:
error: :3:1: error: cannot convert value of type '() -> ()' to type 'ActionStringDoneBlock' (aka '(Optional, Int, Optional) -> ()') in coercion
我也试过定义 done
如下:
let done = {(picker: Optional<ActionSheetStringPicker>, selectedIndex:Int, selectedValue: Optional<Any>) in
//My Codes
}
但又遇到同样的错误。有人知道 swift 代码中的问题是什么吗?
您需要注释闭包类型并省略传递的类型
let done : ActionStringDoneBlock = { (picker, selectedIndex, selectedValue) in ... }
let cancel : ActionStringCancelBlock = { picker in ... }
如果没有注释,闭包将被视为 () -> ()
。这就是错误消息所说的。