Home > other >  what can I pass [SomeType] to "paramName: SomeType = []" swift?
what can I pass [SomeType] to "paramName: SomeType = []" swift?

Time:07-02

I'm pretty new to swift, trying to get authorization from user.

to request multiple auth at once, I gathered multiple options as array, and trying to request.

let variableArray = [UNAuthorizationOptions.badge, UNAuthorizationOptions.alert]
// error: Cannot convert value of type '[UNAuthorizationOptions]' to expected argument type 'UNAuthorizationOptions'
try! await UNUserNotificationCenter.current().requestAuthorization(options: variableArray)


//these works.        
try! await UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert])
try! await UNUserNotificationCenter.current().requestAuthorization(options: .badge)

so I checked requestAuthorization, and found this:

open func requestAuthorization(options: UNAuthorizationOptions = []) async throws -> Bool

I think it takes both UNAuthorizationOptions and [UNAuthorizationOptions] but compiler says

"hey, you are trying to pass [UNAuthorizationOptions] but I need UNAuthorizationOptions!"

how can I append variableArray above code to requestAuthorization?

CodePudding user response:

This is because UNAuthorizationOptions conforms to the protocol OptionSet and an OptionSet can be initialised using an array literal, that is [...] which is something different than your variableArray which is an Array object.

So this is why you can do both

try! await UNUserNotificationCenter.current().requestAuthorization(options: [.badge, .alert])
try! await UNUserNotificationCenter.current().requestAuthorization(options: .badge)

because one takes an UNAuthorizationOptions and the other one an OptionSet of UNAuthorizationOptions

You will find that this is quite a common pattern in swift when passing options or similar to functions in UIKit, AppKit, Foundation etc

CodePudding user response:

You need to explicitly specify the type of your variableArray as UNAuthorizationOptions. Replace variableArray with:

let variableArray: UNAuthorizationOptions = [UNAuthorizationOptions.badge, UNAuthorizationOptions.alert]
  • Related