2016-09-16 4 views
3

Я использую каркас кокосовой струи Fusuma. Тем не менее, я обнаружил, что у них есть объективный протокол C, даже подумал, что весь проект был написан быстро.объективный протокол 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 протокола, так как тип параметра не может быть представлен в Objective-C

Я имею в виду, об удалении @objc перед протоколом, но затем он говорит, что мне нужно удалить дополнительную функцию. Я не возражаю изменить их до нормальной функции, однако, я хочу узнать, что мне следует знать, если я удалю @objc

Функция, которую я пытаюсь добавить, - это еще одна функция делегата для предыдущего VC. В этом случае у меня есть 3 VC. Второй, который является этим, захватывает данные из третьего VC после его увольнения. Затем я хочу добавить следующие функции делегата, чтобы VC1, чтобы начать загрузку данных

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

Вероятно, они нуждаются в динамических возможностях Objective-C. Вы не можете сделать это в Свифт. –

+0

Как выглядит функция, которую вы пытаетесь добавить? –

+0

@MikeTaverne, пожалуйста, ознакомьтесь с обновленным вопросом, который касается вашего вопроса. Я попытался удалить необязательный func и удалить objC, но он дает мне ошибку, поскольку метод не может быть объявлен public, поскольку его параметр использует внутренний тип. Поэтому я просто создал совершенно отдельный протокол, чтобы справиться с этим. Не уверен, что это правильный способ сделать это. Кажется, что взлом – user172902

ответ

2

ИМЕЕТ @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*/} 
} 

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