如何对类变量进行可用性检查

  • 本文关键字:可用性 类变量 ios swift
  • 更新时间 :
  • 英文 :


我目前的项目支持iOS 7+,在我的一个视图控制器,我试图同时使用UIAlertView和UIAlertController。

我有#available条件在我的方法中工作,但我不确定如何包装变量。

当我有:

var alertController: UIAlertController!
var alertView: UIAlertView!

我得到一个错误消息告诉我UIAlertController只在iOS 8+中可用,并通过"添加@available到封闭类"来"修复它"。但是,我认为这标记了整个类,这不是我想要的。

我刚刚遇到这个问题,我也一直在努力寻找一个解决方案,所以最终使变量懒惰和默认为nil,同时添加可用性注释

对于您的实现,它看起来像这样:

@available(iOS 8.0, *)
lazy var alertController: UIAlertController? = { return nil }()

当你试图访问该属性时,编译器将确保它在可用性检查中受到保护,所以你总是有:

if #available(iOS 8.0, *) {
    self.alertController = ...
} else 
    self.alertView = ...
}

如果你只需要在一个函数中使用alert,你可以把你的代码移到函数块中,XCode 7会给出有效的建议。

如果你需要在几个功能块中使用alert并且一遍又一遍地引用同一个alert对象该怎么办?

你可以使用一个新的UIResponder并根据可用性将它向下cast到UIAlertController或UIView。我还没有在我的项目中测试它,但它应该工作。

let alertContainer: UIResponder?
init () {
    if #available(iOS 8.0, *) {
        let alertController: UIAlertController!
        alertContainer = alertController
    } else {
        let alertView: UIAlertView!
        alertContainer = alertView
    }
}
func someFunction () {
    if #available(iOS 8.0, *) {
        var alertController = alertContainer as! UIAlertController
        // use the alertController
    } else {
        var alertView = alertContainer as! UIAlertView
        // use the UIAlertView
    }
}

这实际上增加了更多的代码,但它通过了Xcode的检查。如果你有更好的解决办法,请告诉我。

最新更新