Протокол Objective-C в Swift

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

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

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

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

person user172902    schedule 16.09.2016    source источник
comment
Скорее всего, им нужны динамические возможности Objective-C. Вы не можете этого сделать в Swift.   -  person Amin Negm-Awad    schedule 16.09.2016
comment
Как выглядит функция, которую вы пытаетесь добавить?   -  person Mike Taverne    schedule 16.09.2016
comment
@MikeTaverne, пожалуйста, просмотрите обновленный вопрос, который отвечает на ваш вопрос. Я попытался удалить необязательную функцию func и удалить objC, но это дает мне сообщение об ошибке, в котором говорится, что метод не может быть объявлен общедоступным, потому что его параметр использует внутренний тип. Так что я закончил тем, что просто создал полностью отдельный протокол, чтобы справиться с этим. Не уверен, что это правильный способ сделать это. Похоже на взлом   -  person user172902    schedule 16.09.2016
comment
Кажется, он жалуется, что PostUpload не может быть представлен в Objective-C. PostUpload наследуется от NSObject?   -  person Mike Taverne    schedule 16.09.2016
comment
@ AminNegem-Awad, это не имеет ничего общего с динамическим поведением Objective-C, но с отсутствием дополнительных требований протокола в Swift.   -  person HAS    schedule 16.09.2016
comment
@MikeTaverne post Upload не наследуется от NSObject, это просто класс PostUpload {}, из которого я управляю загрузкой на Amazon. Я видел людей, выполняющих class className: NSObject {}, но я не уверен, когда это требуется   -  person user172902    schedule 16.09.2016


Ответы (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*/}
}

Конечно, тогда у вас есть проблема с реализацией по умолчанию, я полагаю, но:

Вы можете использовать расширения протокола, чтобы обеспечить реализацию по умолчанию для любого метода или требования к вычисляемым свойствам этого протокола. Если соответствующий тип предоставляет свою собственную реализацию требуемого метода или свойства, эта реализация будет использоваться вместо той, которая предоставляется расширением. Быстрый язык программирования

Это было создано на игровой площадке, чтобы дать вам представление без каких-либо ошибок:

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()
    }
}
person Jacob Boyd    schedule 09.11.2016