web-dev-qa-db-ja.com

Swift 2?のregisterUserNotificationSettingsへの変更

昨年11月に作成されたもの( ここ )を超えてregisterUserNotificationSettingsにドキュメントが見つからないようですが、Xcode7とSwift 2。

AppDelegateに次のコードがあります。

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>))

コードの最終行で次の2つのエラーが発生します。

「Element.Protocol」には「Alert」という名前のメンバーがありません

そして

タイプ '(UIUserNotificationSettings)'の引数リストで 'registerUserNotificationSettings'を呼び出すことはできません

変更に関する情報を検索しましたが、何も見つかりません。明らかな何かが欠けていますか?

15
Adam Johnson

(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>))
30
Bannings

@Banningの答えは機能しますが、これをより迅速な方法で行うことは可能です。 NSSetとダウンキャストを使用する代わりに、ジェネリック型UIUserNotificationCategoryのセットを使用してこれをゼロから構築できます。

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

コードを複数の行に分割すると、問題がどこにあるかを正確に特定するのに役立つことにも注意してください。この場合、式がインライン化されているため、2番目のエラーは最初のエラーの結果のみです。

そして、@ stephencelisが以下のコメントで専門的に指摘したように、セットはArrayLiteralConvertibleなので、これを次のように減らすことができます。

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