【问题标题】:Objective-C protocol in SwiftSwift 中的 Objective-C 协议
【发布时间】: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 中没有可选的协议要求有关。

标签: ios objective-c swift cocoapods bridging-header


【解决方案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()
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2015-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多