swift中有很好的@available属性可以在编译时测试可用性。 例如。 HKQuantityTypeIdentifierAppleExerciseTime标识符仅在iOS 9.3中可用, 因此,如果我们想要使用它,我们需要检查可用性,如下所示:
@available(iOS 9.3, *)
public static let supportedTypes = [
HKQuantityTypeIdentifierActiveEnergyBurned,
HKQuantityTypeIdentifierAppleExerciseTime
]
但是当标识符不可用时,是否可以添加案例? 在iOS中定义相同的常量< 9.3 as:
// iOS < 9.3 case:
public static let supportedTypes = [
HKQuantityTypeIdentifierActiveEnergyBurned
]
答案 0 :(得分:3)
您可以声明变量并使用#available
初始化它:
public static let supportedTypes: [String] = {
guard #available (iOS 9.3, *) else {
return [ HKQuantityTypeIdentifierActiveEnergyBurned ]
}
return [
HKQuantityTypeIdentifierActiveEnergyBurned,
HKQuantityTypeIdentifierAppleExerciseTime
]
}()
您实际上是在尝试声明具有相同名称和不同默认值的两个变量之一,具体取决于条件。我认为一次声明单个变量更直接,然后根据相同的条件分配其默认值。基本上与课程相同。
答案 1 :(得分:0)
我目前的解决方案是使用#available:
static func setupTypes() -> [String] {
if #available(iOS 9.3, *) {
return [
HKQuantityTypeIdentifierActiveEnergyBurned,
HKQuantityTypeIdentifierAppleExerciseTime
]
else{
return [
HKQuantityTypeIdentifierActiveEnergyBurned,
]
}
}
public static let supportedTypes:[String] = MyClass.setupTypes()
但这是额外的复杂功能,也不能应用于整个班级,所以问题仍然存在。