Swift 2 中 registerUserNotificationSettings 的变化?

Posted

技术标签:

【中文标题】Swift 2 中 registerUserNotificationSettings 的变化?【英文标题】:Changes to registerUserNotificationSettings in Swift 2? 【发布时间】:2015-06-14 14:10:45 【问题描述】:

除了去年 11 月 (here) 生成的内容之外,我似乎找不到任何关于 registerUserNotificationSettings 的文档,但我的旧代码在 Xcode 7 和 Swift 2 中似乎不再适用于我。

我在 App Delegate 中有这段代码:

let endGameAction = UIMutableUserNotificationAction()
endGameAction.identifier = "END_GAME"
endGameAction.title = "End Game"
endGameAction.activationMode = .Background
endGameAction.authenticationRequired = false
endGameAction.destructive = true

let continueGameAction = UIMutableUserNotificationAction()
continueGameAction.identifier = "CONTINUE_GAME"
continueGameAction.title = "Continue"
continueGameAction.activationMode = .Foreground
continueGameAction.authenticationRequired = false
continueGameAction.destructive = false

let restartGameCategory = UIMutableUserNotificationCategory()
restartGameCategory.identifier = "RESTART_CATEGORY"
restartGameCategory.setActions([continueGameAction, endGameAction], forContext: .Default)
restartGameCategory.setActions([endGameAction, continueGameAction], forContext: .Minimal)

application.registerUserNotificationSettings(UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: (NSSet(array: [restartGameCategory])) as Set<NSObject>))

我现在在最后一行代码中收到以下两个错误:

“Element.Protocol”没有名为“Alert”的成员

无法使用“(UIUserNotificationSettings)”类型的参数列表调用“registerUserNotificationSettings”

我搜索了有关任何更改的信息,但找不到任何内容。我错过了什么明显的东西吗?

【问题讨论】:

【参考方案1】:

而不是像这样使用(NSSet(array: [restartGameCategory])) as Set&lt;NSObject&gt;)(NSSet(array: [restartGameCategory])) as? Set&lt;UIUserNotificationCategory&gt;)

application.registerUserNotificationSettings(
    UIUserNotificationSettings(
        forTypes: [.Alert, .Badge, .Sound],
        categories: (NSSet(array: [restartGameCategory])) as? Set<UIUserNotificationCategory>))

【讨论】:

【参考方案2】:

@Banning 的回答会起作用,但可以以更迅速的方式做到这一点。您可以使用泛型类型为 UIUserNotificationCategory 的 Set 从头开始​​构建它,而不是使用 NSSet 和向下转换。

let categories = Set<UIUserNotificationCategory>(arrayLiteral: restartGameCategory)
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: categories)
application.registerUserNotificationSettings(settings)

还值得注意的是,将代码分成多行有助于您准确识别问题所在。在这种情况下,您的第二个错误只是第一个错误的结果,因为表达式是内联的。

正如@stephencelis 在下面的评论中专业指出的那样,集合是ArrayLiteralConvertible,因此您可以将其一直减少到以下内容。

let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: [restartGameCategory])

【讨论】:

这看起来确实比我原来的代码简洁很多 - 谢谢@0x7fffffff。

以上是关于Swift 2 中 registerUserNotificationSettings 的变化?的主要内容,如果未能解决你的问题,请参考以下文章

swift 2.2 语法 (上)

将swift 2视频代码转换为swift 3视频代码

swift 在swift 2中检查字符串是否为回文的函数

Swift 2 升级 Swift 3 在许多方法中编译错误,例如 willTransitionToTraitCollection:newCollection:withTransitionCoordin

在 Swift 3 中解析 JSON,就像 Apple 的 Swift 2 示例一样

如何在 Swift 2.2 中编写这些函数?