Использование строкового литерала для селекторов Objective-C устарело, вместо этого используйте '#selector'

У меня есть следующий код:

func setupShortcutItems(launchOptions: [NSObject: AnyObject]?) -> Bool {
    var shouldPerformAdditionalDelegateHandling: Bool = false

    if (UIApplicationShortcutItem.respondsToSelector("new")) {
        self.configDynamicShortcutItems()

        // If a shortcut was launched, display its information and take the appropriate action
        if let shortcutItem: UIApplicationShortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem {
            // When the app launched at the first time, this block can not called.
            self.handleShortCutItem(shortcutItem)

            // This will block "performActionForShortcutItem:completionHandler" from being called.
            shouldPerformAdditionalDelegateHandling = false
        } else {
            // normal app launch process without quick action
            self.launchWithoutQuickAction()
        }
    } else {
        // Less than iOS9 or later
        self.launchWithoutQuickAction()
    }

    return shouldPerformAdditionalDelegateHandling
}

Я получаю следующее "предупреждение" на UIApplicationShortcutItem.respondsToSelector("new"), в котором говорится:

Использование строкового литерала для селекторов Objective-c устарело, вместо этого используйте '#selector'

Предупреждение автоматически заменяет код:

UIApplicationShortcutItem.respondsToSelector(#selector(FBSDKAccessToken.new))

Однако это не скомпилируется, потому что new() недоступен. Что я должен использовать в этом случае?

Ответ 1

Xcode 7.3 с использованием swift для iOS9.3/watchOS2.2/...

Если вы ранее использовали эту строку кода:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateResult:", name: "updateResult", object: nil)

теперь вы должны использовать эту строку кода:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(InterfaceController.updateResult(_:)), name: "updateResult", object: nil)

по крайней мере, это то, что предложил Xcode после того, как я изменил несколько символов в коде. Похоже, что это не всегда дает правильное решение, когда вы получаете эту ошибку.

Ответ 2

Создайте протокол, единственная причина для которого - позволить вам создать соответствующий селектор. В этом случае:

@objc protocol NewMenuItemHandling {
  func new()
} 

Вы принимаете неофициальный протокол (объект, который отвечает на новый селектор) и превращаете его в формальный протокол.

Затем, где вы хотите использовать селектор, вы можете добавить выражение:

#selector(NewMenuItemHandling.new)

Ответ 3

В этой специальной ситуации respondsToSelector, где у вас нет существующего метода, с которым можно связать ссылку на функцию, напишите это:

UIApplicationShortcutItem.respondsToSelector(Selector("new"))

Вы все равно получите предупреждение (вы не должны, и я подал на него ошибку), но это будет другое предупреждение, и вы можете игнорировать его.

Ответ 4

Таким образом, каждый "селектор: функция или объект" теперь "селектор: #selector (class.funtion(_:))", где бы он ни использовался.