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

Ios Swift编译时可用性:不可用的情况,ios,swift,compile-time,availability,Ios,Swift,Compile Time,Availability,swift中有nice@available属性来测试编译时的可用性。 例如,HKQuantityTypeIdentifierAppleExerciseTime标识符仅在iOS 9.3之后可用, 因此,如果我们想使用它,我们需要像这样检查可用性: @available(iOS 9.3, *) public static let supportedTypes = [ HKQuantityTypeIdentifierActiveEnergyBurned, HKQuantityTypeI

swift中有nice@available属性来测试编译时的可用性。 例如,HKQuantityTypeIdentifierAppleExerciseTime标识符仅在iOS 9.3之后可用, 因此,如果我们想使用它,我们需要像这样检查可用性:

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

public static let supportedTypes:[String] = MyClass.setupTypes()
但当标识符不可用时,是否也可以添加case? 将iOS<9.3中的同一常数定义为:

// iOS < 9.3 case:
public static let supportedTypes = [
    HKQuantityTypeIdentifierActiveEnergyBurned
]
//iOS<9.3案例:
公共静态let支持的类型=[
HKQuantityTypeIdentifierActivieEnergyBurned
]

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

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

   return [
       HKQuantityTypeIdentifierActiveEnergyBurned,
       HKQuantityTypeIdentifierAppleExerciseTime
   ]
}()

实际上,您是在尝试声明两个具有相同名称和不同默认值的变量中的一个,具体取决于条件。我认为更简单的方法是只声明一个变量一次,然后根据相同的条件指定其默认值。类基本上也是如此。

我当前的解决方案是使用以下可用的:

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

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

但这是一个额外的复杂问题,也不能应用于整个类,所以问题仍然悬而未决。

它编译时出错:无法在当前上下文中推断闭包返回类型是的,很抱歉,这是我的想法,我忘了显式指定
let
类型(正如编译器所抱怨的,这无法从上下文中推断出来)。我已经用
:[String]更新了我的答案
-请随时再试一次。请不要认为我是在为自己的解决方案辩护,而是试图理解您需要实现的目标。我已经用我对复杂问题的想法更新了我的答案,如果您想提供更多的背景,说明为什么您需要遵循这种特定的做事方式来帮助我和其他人,请告诉我亚历克斯,你的答案是好的,我已经投票赞成了。但是仍然在等待其他的解决方案。例如,考虑整个类的不可替代的情况。当然,当然,对于类,同样的规则也适用。我猜:不是定义两个同名类中的一个,而是想定义一个类,并调整它的行为DEP。以API可用性结束。