Swift编译时可用性:不可用的情况

时间:2016-05-24 13:33:36

标签: ios swift compile-time availability

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
]

2 个答案:

答案 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()

但这是额外的复杂功能,也不能应用于整个班级,所以问题仍然存在。