检查UIView是否有属性

问题描述:

我的项目正在使用CircleCI为单元测试构建,它使用XCode 8。以下代码崩溃,因为它使用UIView的属性safeAreaLayoutGuide,它不存在于iOS 10 SDK中,即使在检查了iOS 11后也是如此。检查UIView是否有属性

if #available(iOS 11, *) { 
     make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
    } 

testViewUIView。我们在这里添加一个导航栏的约束。有没有更好的方法来检查UIView是否有这个特定的属性? safeAreaLayoutGuide不是Optional

错误消息:类型的UIView'的值没有任何成员 'safeAreaLayoutGuide'

+0

什么是错误信息? – aaron

+0

使用可用性是在Swift中检查不同平台的建议方法。如果你在Objective C中,还有其他的,比如检查对选择器的响应或SDk中特定类的存在。但在SWIFT的情况下你完全正确并以标准方式使用#available –

+0

@aaron我添加了错误消息 – DesperateLearner

CircleCI将在if #available(iOS 11, *)构建失败。我会说你用circle.yml文件升级到XCode 9。在此之前使用视图的视图控制器的toplayoutguide。

您应该能够使用respondsToSelector作为UIView的仍符合NSObjectProtocol:

if testView.responds(to: #selector(safeAreaLayoutGuide)) { 
    make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
} 

如果您正在使用safeAreaLayoutGuide,您应该只使用Xcode 9+。 因为safeAreaLayoutGuideUIView属性被添加在ios11 SDK以上。

if #available(iOS 11, *) { 
    print("for iOS 11 User") 
} else { 
    print("for iOS < 11 user") 
} 

if状况的上述检查主要用于那些谁在iOS11 &上else部分的代码将是谁与较低版本等iOS10运行这些用户的用户。

Apple Doc