检查switch语句中的可用性

时间:2017-06-02 09:39:52

标签: swift availability

如果Enum类型在新的os版本中添加新的case,如何在switch语句中检查可用性? 与下面Enum中的StoreKit一样

public enum Code : Int {
    public typealias _ErrorType = SKError
    case unknown
    case clientInvalid 
    case paymentCancelled 
    case paymentInvalid 
    case paymentNotAllowed
    case storeProductNotAvailable
    @available(iOS 9.3, *)
    case cloudServicePermissionDenied 
    @available(iOS 9.3, *)
    case cloudServiceNetworkConnectionFailed
    @available(iOS 10.3, *)
    case cloudServiceRevoked
}

以下代码是唯一的解决方案吗?这太过分了。

if #available(iOS 10.3, *) {
    switch code {
        //all cases available in 10.3
        ...
    }
} else if #available(iOS 9.3, *) {
    switch code {
       //all cases available in 9.3
       ...
    }
} else {
    switch code {
        //all cases available below 9.3
        ...
    }
}

-----------------新-------------------------

我认为这不是一个问题。在一个switch中写入的所有案例都很好,if语句是不必要的。因为新添加的案例不会在低iOS版本中调用。

3 个答案:

答案 0 :(得分:4)

通常,它会在带有新版SDK和工具链的Xcode的新版本中发生。 因此,例如Xcode 12与iOS 14 SDK和Swift 5.3捆绑在一起,并且在诸如PHAuthorizationStatus.limited之类的新案例中也存在类似的问题,这些新案例被标记为仅在iOS 14中可用,并且它将破坏switch语句而没有{{ 1}}的情况。

作为一种使Xcode 11和Xcode 12都能正常工作的解决方法,我想建议以下解决方案,检查Swift版本:

default

答案 1 :(得分:0)

我想你可以这样做:

switch transactionCode {
    case SKError.unknown:
        //Handle case
    //(rest of ios < 9.3 available types)
    default:
        if #available(iOS 9.3, *) {
            if transactionCode == SKError.cloudServiceNetworkConnectionFailed {
                //Handle case
            }
            else if transactionCode == SKError.cloudServicePermissionDenied {
                //Handle case
            }
        }
        if #available(iOS 10.3, *) {
            if transactionCode == SKError.cloudServiceRevoked {
                //Handle case
            }
        }
    }

如果没有默认情况,您无法进行详尽的切换语句,但没有冗余代码。

答案 2 :(得分:0)

这个怎么样?

if error.code == SKError.unknown {

} else if error.code == SKError.clientInvalid {

} else if error.code == SKError.paymentCancelled {

} else if error.code == SKError.paymentInvalid {

} else if error.code == SKError.paymentNotAllowed {

} else if error.code == SKError.storeProductNotAvailable {

} else if #available(iOS 9.3, *), error.code == SKError.cloudServicePermissionDenied {

} else if #available(iOS 9.3, *), error.code == SKError.cloudServiceNetworkConnectionFailed {

} else if #available(iOS 10.3, *), error.code == SKError.cloudServiceRevoked {

}