2016-09-16 88 views
3

我使用Fusuma cocoal pod框架。但是,我发现他们有一个客观的C协议,甚至认为整个项目都是快速编写的。swift中的客观C协议

@objc public protocol FusumaDelegate: class { 

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

    optional func fusumaClosed() 
} 

我想在协议中添加另一个功能。然而,我正在此warining

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

我正在考虑去除@objc在协议前面,但它说我必须删除可选的func。我不介意改变他们只是正常的func,但是,我想找出如果我删除@objc我应该知道什么我想添加的函数是另一个代表函数的前一个VC。在这种情况下,我有3个VC。这是第二个被解散后从第三VC获取的数据。然后我想添加下面的委托功能,让VC1开始上传

extension FusumaViewController: VC3Delegate { 
    func readyToUploadPost(postUpload: PostUpload) { 
    delegate_?.readyToUploadPost_Fusuma(postUpload) 
} 
+0

可能,他们需要的Objective-C的动态能力。你不能在Swift中这样做。 –

+0

您尝试添加的功能看起来像什么? –

+0

@MikeTaverne,请参阅解决您问题的更新问题。我试图删除可选的func并删除objC,但它给了我一个错误,说明Method不能被声明为public,因为它的参数使用了一个内部类型。所以我最终创建了一个完全独立的协议来处理它。不知道这是否是正确的做法。看起来像一个黑客 – user172902

回答

2

有@HAS规定的最可能的原因该协议被赋予了@objc是因为斯威夫特不允许使用可选的数据协议要求方法。这样做的快捷方式是:

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*/} 
} 

Ofcourse,那么你有一个默认的实现的问题,我想,但:

您可以使用协议扩展提供了默认实现该协议的任何方法或计算的特性要求。如果一致性类型提供了自己的必需方法或属性的实现,则将使用该实现来代替扩展提供的实现。 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() 
    } 
}