Swift中的_cmd用于选择器

时间:2016-12-09 05:08:28

标签: objective-c swift macros selector

我试图在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(_:))有效,但有没有办法让它保持通用?

修改:可能的重复答案是关于获取函数名称,而不是我上面提到的

1 个答案:

答案 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)。