【问题标题】:How to call a swift method which parameter is a protocol from Objective-C如何调用参数是Objective-C协议的快速方法
【发布时间】:2019-07-05 17:24:52
【问题描述】:

如何调用一个参数是Objective-C协议的swift方法。

Class A
{
func sendMessage<Serializable: Encodable>(message:Serializable){
        let jsonData =   try! JSONEncoder().encode(message)
    
    }
}

Objective-C 代码

A a = [[A alloc] init];
[a sendMessage] ;// Not Available

如何从 Objective-C 调用这个方法。

【问题讨论】:

  • 你导入了TargetName-Swift.h
  • 我已经导入了它,我可以调用其他只有字符串作为参数的方法。
  • 你试过在func声明前面添加@objc吗?类似“@objc func sendMessage...”
  • @santhosh :如果您认为它澄清了您的疑问,请考虑接受答案
  • @santhosh:谢谢 :)

标签: ios objective-c swift


【解决方案1】:

我认为sendMessage 不会出现在编译后的TargetName-Swift.h 中,因为泛型和Encodable 协议在Objective-C 中不可用。

用的时候清楚

sendMessage&lt;Serializable: Encodable&gt;(message:Serializable)

您使用泛型以及 Encodable 协议,该协议仅在 Swift 中可用,而在 Objective-C 中不可用

当您尝试访问 Objective-C 文件中的 Swift 函数时,编译器会创建一个 Objective-C 等效/对应的 Swift 函数,因此您会在 TargetName-Swift.h 文件中看到这些方法的签名。

但是GenericsEncodable 协议在Objective-C 中不可用,因此它无法使用GenericsEncodable 协议将您的Swift 函数转换为Objective-C 等效协议。因此,你永远不能从 Objective-C 文件中调用这样的 Swift 方法

【讨论】:

    猜你喜欢
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多