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<NSObject>)
和(NSSet(array: [restartGameCategory])) as? Set<UIUserNotificationCategory>)
:
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 升级 Swift 3 在许多方法中编译错误,例如 willTransitionToTraitCollection:newCollection:withTransitionCoordin