不推荐使用Objective-C选择器的字符串文字,而是使用'#selector'代替

时间:2016-03-23 04:48:12

标签: ios objective-c iphone swift

我有以下代码:

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()不可用,因此无法编译。 在这种情况下我应该使用什么?

4 个答案:

答案 0 :(得分:17)

Xcode 7.3使用swift for 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在我改变代码中的几个字符后提供给我的。当您遇到此错误时,似乎并不总能提供正确的解决方案。

答案 1 :(得分:8)

创建一个协议,其唯一的原因是允许您构造适当的选择器。在这种情况下:

@objc protocol NewMenuItemHandling {
  func new()
} 

您正在使用非正式协议(响应新选择器的对象)并将其转换为正式协议。

然后,您可以使用选择器添加表达式:

#selector(NewMenuItemHandling.new)

答案 2 :(得分:2)

在这种特殊的respondsToSelector情况下,您没有与函数引用关联的现有方法,请写下:

UIApplicationShortcutItem.respondsToSelector(Selector("new"))

你仍然会收到警告(你不应该,我已经提交了一个反对它的错误),但这将是一个不同的警告,你可以忽略它。

答案 3 :(得分:0)

总之,每个"选择器:功能或对象"现在是"选择器:#selector(class.funtion(_ :))"无论在哪里使用。