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

时间:2015-07-09 22:09:15

标签: ios swift

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

我的方法中有#available条件,但我不知道如何包装变量。

当我有:

var alertController: UIAlertController!
var alertView: UIAlertView!

我收到一条错误消息告诉我UIAlertController仅在iOS 8+中可用,并且“通过”将@available添加到封闭类中来“修复它”选项。但是我认为这标志着整个班级,而这不是我想要的。

2 个答案:

答案 0 :(得分:20)

我刚刚遇到这个问题而且我也很难找到解决方案,所以最终使变量变得懒惰并且默认为nil,同时添加了可用性注释

对于您的实现,如下所示:

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

然后,无论何时尝试访问该属性,编译器都会确保在可用性检查中对其进行保护,以便您始终拥有:

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

答案 1 :(得分:1)

如果您只需要在一个函数中使用alert,您只需将代码移动到func块中,XCode 7就会提出可行的建议。

如果您需要在多个func块中使用alert并一遍又一遍地引用同一个警报对象,该怎么办?

您可以使用新的UIResponder并根据可用性将其向下传播到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的检查。如果您想出更好的解决方案,请告诉我。