将@available与存储的属性一起使用

chi*_*arm 17 ios uilocalnotification swift

我有一个使用本地通知并支持iOS 10的应用程序.我正在尝试添加iOS 9支持,这需要我使用旧的位置通知API.我试图在我的iOS 10代码上使用@available和#available,我无法弄清楚如何将我的中心变量仅用于运行iOS 10的设备.

当我将目标从iOS 10设置为9时,我收到此变量的错误消息:"UNUserNotificationCenter仅适用于iOS 10.0或更高版本." 它建议我将"@available(iOS 10.0,*)"添加到我的整个班级,我不想这样做,因为这个类中的代码将用于iOS 9.我很感激有关如何限制我的任何建议中心属性到iOS 10.

class ViewController: UIViewController, UITextFieldDelegate {

  let center = UNUserNotificationCenter.current()
  ...
Run Code Online (Sandbox Code Playgroud)

mir*_*cal 43

我在 XCode 14 的 Flutter 项目中遇到此错误。外部包之一正在使用:

@available(iOS 14.0, *)
Run Code Online (Sandbox Code Playgroud)

我当前的修复是:

更新 Podfile 中的版本 platform :ios, '14.0'

重置 Pod cd ios && rm -rf Pods/ Podfile.lock && pod install --repo-update

问题: https: //github.com/pichillilorenzo/flutter_inappwebview/issues/1216


kga*_*dis 24

以下是一个潜在的解决方案(感谢博客文章).

我们的想法是使用类型为的存储属性,Any然后创建一个计算属性,该属性将转换存储的属性(并在必要时实例化它).

private var _selectionFeedbackGenerator: Any? = nil
@available(iOS 10.0, *)
fileprivate var selectionFeedbackGenerator: UISelectionFeedbackGenerator {
    if _selectionFeedbackGenerator == nil {
        _selectionFeedbackGenerator = UISelectionFeedbackGenerator()
    }
    return _selectionFeedbackGenerator as! UISelectionFeedbackGenerator
}
Run Code Online (Sandbox Code Playgroud)


Jay*_*son 14

我知道这是一个比较老的问题,但是我想为像我一样通过Google来到这里的人们添加一个答案。

正如kgaidis和Cœur所述,您可以@available在计算属性上使用。但是,lazy变量被视为计算属性,因此您也可以使用@available它们。这具有删除多余的存储属性和强制强制转换的样板的好处,实际上,在iOS 10之前的代码中没有留下该属性的证据。

您可以像这样简单地声明它:

@available(iOS 10.0, *)
lazy private(set) var center = UNUserNotificationCenter.current()
Run Code Online (Sandbox Code Playgroud)

不幸的是,没有办法使它完全是只读的,但是private(set)至少在类之外使它成为只读的。

  • 无法再在 Xcode 14 beta 中工作 (4认同)

Jam*_*hen 6

@available 可以用于整个类或一个或多个函数,但不能用于属性。

关于您的 UNUserNotificationCenter 用法,current返回一个永远不会改变的单例,那么为什么不删除center常量,而只使用UNUserNotificationCenter.current()where centeris used?