Swift 中的 Objective-C 协议

Posted

技术标签:

【中文标题】Swift 中的 Objective-C 协议【英文标题】:Objective-C protocol in Swift 【发布时间】:2016-09-16 03:00:56 【问题描述】:

我正在使用 Fusuma cocoal pod 框架。然而,我发现他们有一个 Objective-C 协议,即使整个项目都是用 Swift 编写的。

@objc public protocol FusumaDelegate: class 

    func fusumaImageSelected(image: UIImage)
    optional func fusumaDismissedWithImage(image: UIImage)
    func fusumaVideoCompleted(withFileURL fileURL: NSURL)
    func fusumaCameraRollUnauthorized()

    optional func fusumaClosed()

我想在协议中添加另一个功能。但是,我收到此警告

方法不能是@objc协议的成员,因为参数的类型不能在objective-C中表示

我正在考虑删除协议前面的@objc,但它说我必须删除可选的 func。我不介意将它们更改为普通功能,但是,我想知道如果我删除 @objc 应该注意什么

我要添加的函数是前一个 VC 的另一个委托函数。在这种情况下,我有 3 个 VC。第二个是这个,它在被解雇后从第三个 VC 中获取数据。然后我想添加下面的委托函数让VC1开始上传数据

extension FusumaViewController: VC3Delegate 
    func readyToUploadPost(postUpload: PostUpload) 
    delegate_?.readyToUploadPost_Fusuma(postUpload)

【问题讨论】:

他们可能需要 Objective-C 的动态功能。你不能在 Swift 中做到这一点。 您尝试添加的功能是什么样的? @MikeTaverne,请查看解决您问题的更新问题。我试图删除可选的 func 并删除 objC,但它给了我一个错误,说 Method cannot be declaredpublic 因为它的参数使用内部类型。所以我最终只是创建了一个完全独立的协议来处理它。不确定这是否是正确的方法。看起来像一个黑客 似乎在抱怨 PostUpload 在 Objective-C 中不可表示。 PostUpload 是否继承自 NSObject? @AminNegem-Awad 这与 Objective-C 的动态行为无关,但与 Swift 中没有可选的协议要求有关。 【参考方案1】:

@HAS 是否声明了此协议被赋予 @objc 的最可能原因是因为 Swift 不允许您使用可选的协议要求方法。这样做的快速方法是:

public protocol FusumaDelegate: class 

    func fusumaImageSelected(image: UIImage)
    func fusumaVideoCompleted(withFileURL fileURL: NSURL)
    func fusumaCameraRollUnauthorized()


extension FusumaDelegate 
    func fusumaDismissedWithImage(image: UIImage) /*Default Implementation*/
    func fusumaClosed() /*Default Implementation*/

当然,我想你有一个默认实现的问题,但是:

您可以使用协议扩展为该协议的任何方法或计算属性要求提供默认实现。如果符合类型提供了它自己的所需方法或属性的实现,则将使用该实现而不是扩展提供的实现。 The Swift Programming Language

这是在操场上创建的,目的是为您提供一个想法,没有任何错误:

public protocol FusumaDelegate: class 
    func fusumaImageSelected(image: UIImage)
    func fusumaVideoCompleted(withFileURL fileURL: NSURL)
    func fusumaCameraRollUnauthorized()


extension FusumaDelegate 
    func fusumaDismissedWithImage(image: UIImage) 
    func fusumaClosed() 



class Test : UIViewController, FusumaDelegate 
    func fusumaImageSelected(image: UIImage) 
        //do stuff
    

    func fusumaVideoCompleted(withFileURL fileURL: NSURL) 
        //do stuff
    

    func fusumaCameraRollUnauthorized() 
        //do stuff
    

    func fusumaDismissedWithImage(image: UIImage) 
        //do stuff
        self.fusumaClosed()
    

【讨论】:

以上是关于Swift 中的 Objective-C 协议的主要内容,如果未能解决你的问题,请参考以下文章

无法将符合协议的 Objective-C 类分配给具有 Swift 协议的属性

无法在框架项目的 Objective-C 代码中导入 Swift 类

如何将 RxSwift 用于 Objective-C 和 Swift 项目?

Swift 类的 Objective-c 协议。无法识别的方法

在 Swift 上委托 Objective-C 协议

将实现协议的 Swift 类导入到 Objective-C 类中