как некоторые рамки iOS определяют протоколы Swift, используя необязательный без @objc?

Как упоминалось в названии, некоторые стандартные протоколы Swift уходят с объявлением необязательных требований без использования @objc. Например:

public protocol UIScrollViewDelegate : NSObjectProtocol {

    @available(iOS 2.0, *)
    optional public func scrollViewDidScroll(_ scrollView: UIScrollView) // any offset changes
    @available(iOS 3.2, *)
    optional public func scrollViewDidZoom(_ scrollView: UIScrollView) // any zoom scale changes
    ...
} 


public protocol UIApplicationDelegate : NSObjectProtocol {
    ...
    @available(iOS 2.0, *)
    optional public func applicationDidBecomeActive(_ application: UIApplication)

    @available(iOS 2.0, *)
    optional public func applicationWillResignActive(_ application: UIApplication)
    ...
}

Следующий тест не удался с ожидаемой ошибкой компиляции из-за отсутствия @objc:

public protocol Test: NSObjectProtocol {
    optional func test()
}
+2
источник поделиться
2 ответа

Optional параметры метода протокола доступны только для протокола на основе Objective-C. UIScrollViewDelegate и UIApplicationDelegate - это протокол на основе Objective-C. Это означает, что вам не нужно @objc свой @objc. Код, который вы видите, является мостом между Objective-C и Swift. Чтобы Swift мог получить доступ к этим методам. Ваш протокол Test определен в Swift. Даже при том, что вы адаптируете NSObjectProtocol класс, не подверженный Objective-C runtime, где доступен дополнительный параметр. По этой причине вам необходимо явно указать, что этот протокол подвергается Objective-C с @objc.

0
источник

Я думаю, это потому, что UIScrollViewDelegate и UIApplicationDelegate - это классы Objective-C, соединенные с Swift для вас.

Мосты @objc Swift для Objective-C fooobar.com/questions/182727/...

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос