Using @available with stored properties
Here is one potential solution (thanks to blog post). The idea is to use a stored property with a type of Any
and then create a computed property that will cast the stored property (and instantiate it if necessary).
private var _selectionFeedbackGenerator: Any? = nil@available(iOS 10.0, *)fileprivate var selectionFeedbackGenerator: UISelectionFeedbackGenerator { if _selectionFeedbackGenerator == nil { _selectionFeedbackGenerator = UISelectionFeedbackGenerator() } return _selectionFeedbackGenerator as! UISelectionFeedbackGenerator}
Another option is to use lazy
(however, this makes the variable read-write):
@available(iOS 10.0, *)private(set) lazy var center = UNUserNotificationCenter.current()
I know this is an older question but I wanted to add an answer for people who come here via Google as I did.
As kgaidis and Cœur mentioned, you can use @available
on computed properties. However, lazy
variables are considered computed properties and so you can use @available
on them too. This has the nice benefit of removing the boilerplate of the extra stored property and the forced casts - in fact, it leaves no evidence of the property in your pre-iOS 10 code.
You can simply declare it like this:
@available(iOS 10.0, *)private(set) lazy var center = UNUserNotificationCenter.current()
Unfortunately there's no way to make it completely read-only but the private(set)
at least makes it read-only outside of the class.
@available
could be used around a whole class or one or more functions, but not for properties.
Regarding your UNUserNotificationCenter usage, current
returns a singleton that never changes, so why not just remove the center
constant, and just use UNUserNotificationCenter.current()
where center
is used?