15

如果一个Enum类型case在新的操作系统版本中添加新的,如何在switch语句中检查可用性?如下EnumStoreKit所示

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 版本中不会调用新添加的案例。

4

3 回答 3

4

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

作为使 Xcode 11 和 Xcode 12 的两个版本都工作的解决方法,我想建议以下解决方案来检查 Swift 版本:

    switch PHPhotoLibrary.authorizationStatus() {
    case .authorized:
        presentImagePicker()
    case .denied:
        presentAccessDeniedAlert()
    case .notDetermined:
        requestAuthorization()
    case .restricted:
        break
#if swift(>=5.3) // Xcode 12 iOS 14 support
    case .limited:
        presentImagePicker()
#endif
    @unknown default:
        assertionFailure()
    }
于 2020-06-24T09:14:00.927 回答
2

我想你可以这样做:

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
            }
        }
    }

如果没有默认情况,您将无法做出详尽的 switch 语句,但没有多余的代码。

于 2017-09-29T21:16:01.373 回答
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 {

}
于 2018-01-22T02:11:58.713 回答