【问题标题】:How to implement a swift delegate method in objective-C having parameter?如何在具有参数的Objective-C中实现快速委托方法?
【发布时间】:2018-08-16 11:58:34
【问题描述】:

我有一个具有以下委托方法的快速协议

@objc public protocol CuteDelegate: NSObjectProtocol {
    @objc func myCuteFunc(name: NSString)
}

我也在swift中声明了委托对象

weak var delegate : CuteDelegate?

在我实现上述委托方法的目标 C 控制器中如下

-(void)myCuteFunc:(NSString* )name{

}

但是在 swift 控制器中调用方法时

 self.delegate?.myCuteFunc(name: str as NSString)

我收到无法识别的选择器发送到实例

任何线索是什么问题

【问题讨论】:

  • 你能分享一下你对delegate的声明

标签: objective-c swift


【解决方案1】:

您需要考虑第一个参数的名称:

任一:

  1. 让你的 Objective-C 函数 -(void)myCuteFuncWithName:(NSString* )name

或者:

  1. 将您的协议更改为@objc func myCuteFunc(_ name: NSString) 并使用self.delegate?.myCuteFunc(str) 调用它

这只是 Objective-C 函数名称的工作方式与 Swift 命名其参数的方式的产物。 Objective-C 没有办法命名第一个参数(通常用函数名来描述),所以如果 Swift 有第一个参数的标签,则使用的约定是添加 With 加上参数名称(与参数名称大写)到函数名称。通过添加 _,您可以将第一个参数设为未命名,这样可以更好地转换为 Objective-C 命名约定。

【讨论】:

  • 感谢您挽救了我的一天,但仍然想知道为什么 _ name: 需要,如果您能解释一下?
  • 这只是 Objective-C 工作方式与 Swift 命名参数方式的产物。 Objective-C 没有办法命名第一个参数,所以如果 Swift 有一个,则使用的约定是添加 With 加上参数名,参数名大写。通过添加_,您可以使第一个参数未命名,以便更好地转换为Objective-C 命名约定。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多