2

swift中有很好的@available属性来测试编译时的可用性。例如 HKQuantityTypeIdentifierAppleExerciseTime 标识符仅从 iOS 9.3 开始可用,所以如果我们想使用它,我们需要像这样检查可用性:

@available(iOS 9.3, *)
public static let supportedTypes = [
    HKQuantityTypeIdentifierActiveEnergyBurned,
    HKQuantityTypeIdentifierAppleExerciseTime
]

但是当标识符不可用时是否可以添加案例?在 iOS < 9.3 中定义相同的常量为:

// iOS < 9.3 case:
public static let supportedTypes = [
    HKQuantityTypeIdentifierActiveEnergyBurned
]
4

2 回答 2

4

您可以声明变量并使用以下命令对其进行初始化#available

public static let supportedTypes: [String] = {
    guard #available (iOS 9.3, *) else { 
        return [ HKQuantityTypeIdentifierActiveEnergyBurned ] 
    }

   return [
       HKQuantityTypeIdentifierActiveEnergyBurned,
       HKQuantityTypeIdentifierAppleExerciseTime
   ]
}()

您实际上是在尝试根据条件声明具有相同名称和不同默认值的两个变量之一。我认为将单个变量声明一次,然后根据相同的条件分配其默认值会更直接。基本上与课程相同。

于 2016-05-24T14:09:52.297 回答
0

我目前的解决方案是像这样使用#available:

static func setupTypes() -> [String] {
    if #available(iOS 9.3, *) {
        return [
            HKQuantityTypeIdentifierActiveEnergyBurned,
            HKQuantityTypeIdentifierAppleExerciseTime
        ]
    else{
        return [
            HKQuantityTypeIdentifierActiveEnergyBurned,
        ]
    }    
}

public static let supportedTypes:[String] = MyClass.setupTypes()

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

于 2016-05-24T14:18:32.277 回答