2016-09-16 1 views
3

Ich benutze Fusuma Kokos Pod-Framework. Ich habe jedoch festgestellt, dass sie ein objektives C-Protokoll haben, obwohl das ganze Projekt in "swift" geschrieben wurde.Ziel C-Protokoll in 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() 
} 

Ich möchte eine weitere Funktion im Protokoll hinzufügen. Allerdings bin ich immer diese warining

Methode kein Mitglied eines @objc Protokoll, da der Typ des Parameters nicht in Objective-C dargestellt werden kann

Ich denke an das Entfernen der @objc sein kann vor dem Protokoll aber dann heißt es ich muss optionale func entfernen. Ich habe nichts dagegen, sie zu normalen Funktionen zu ändern, aber ich möchte herausfinden, was ich beachten sollte, wenn ich @objc entfernen

Die Funktion, die ich hinzufügen möchte, ist eine andere Delegat-Funktion für die vorherige VC. Ich habe 3 VCs in diesem Fall. Die zweite, die diese ist, ergreift die Daten von der dritten VC, nachdem sie entlassen wurde. Dann mag ich die folgende Delegatfunktion hinzuzufügen VC1, damit beginnen, die Daten zu

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

wahrscheinlich, dass sie die dynamischen Fähigkeiten von Objective-C benötigen. Das kannst du nicht in Swift machen. –

+0

Wie sieht die Funktion aus, die Sie hinzufügen möchten? –

+0

@MikeTaverne, sehen Sie sich bitte die aktualisierte Frage an, die Ihre Frage beantwortet. Ich habe versucht, das optionale func zu entfernen und das objC zu entfernen, aber es gibt mir einen Fehler, der besagt, dass Methode nicht öffentlich deklariert werden kann, weil ihr Parameter einen internen Typ verwendet. Also habe ich einfach ein komplett separates Protokoll erstellt, um damit umzugehen. Nicht sicher, ob das der richtige Weg ist. Scheint wie ein Hack – user172902

Antwort

2

Hat @HAS den wahrscheinlichste Grund angegeben dieses Protokoll gegeben wurde die @objc ist, weil Swift nicht zulässt Sie optional verwenden, Protokollanforderung Methoden. Der schnelle Weg, dies zu tun wäre:

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, dann sind Sie das Problem einer Standardimplementierung haben, nehme ich an, aber:

können Sie Protokollerweiterungen verwenden, um eine Standardimplementierung bieten jede Methode oder jede berechnete Eigenschaft dieses Protokolls. Wenn ein übereinstimmender Typ eine eigene Implementierung einer erforderlichen Methode oder Eigenschaft bereitstellt, wird diese Implementierung anstelle der von der Erweiterung bereitgestellten verwendet. The Swift Programming Language

Dies wurde auf einem Spielplatz geschaffen, um Ihnen eine Idee zu geben, ohne Fehler:

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() 
    } 
} 
Verwandte Themen