我试图在Swift 3中编写以下ObjC代码:
- (void)scrollViewScroll:(UIScrollView*)scrollView {
// some code
if ([_userDelegate respondsToSelector:_cmd]) {
[_userDelegate scrollViewDidEndDecelerating:scrollView];
}
}
但不知道用什么替换_cmd。我正在尝试功能,但它不起作用:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// some code
if (userDelegate?.responds(to: #function))! {
userDelegate?.scrollViewDidScroll!(scrollView)
}
}
使用#selector(scrollViewDidScroll(_:))
有效,但有没有办法让它保持通用?
修改:可能的重复答案是关于获取函数名称,而不是我上面提到的
答案 0 :(得分:2)
Swift没有选择器。 Objective-C在Swift调用函数时向对象发送消息。因此,检查对象是否可以响应选择器是Objective-C和NSObject的一部分。
默认情况下,Swift协议函数为required
。 Swift编译器不允许您跳过这些函数实现。但你可以让它们optional
,你必须检查,如果在调用之前实现了这些功能。
在这种情况下,只需在末尾调用带问号的功能,如此
if let returnValue = userDelegate?.theOptionalFunction?(arguments) {
// you got value
} else {
// delegate returned nil or delegate function isn't implemented
}
来源:The Swift Programming Language
可以使用可选链接调用可选协议要求,以考虑符合协议的类型未实现要求的可能性。您可以通过在调用方法名称后面写一个问号来检查可选方法的实现,例如someOptionalMethod?(someArgument)。