2016-09-16 90 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() 
    } 
}