【问题标题】:Check availability in switch statement在 switch 语句中检查可用性
【发布时间】:2017-06-02 09:39:52
【问题描述】:

如果Enum在新的操作系统版本中添加新的case,如何在switch语句中检查可用性? 就像下面的StoreKit 中的Enum

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低版本不会调用新增的case。

【问题讨论】:

    标签: swift availability


    【解决方案1】:

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

    作为使 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()
        }
    

    【讨论】:

    • 在 UIUserInterfaceIdiom 枚举中添加 .Mac 时遇到了这个确切的问题。使用它来编译 Xcode11(因为大多数团队仍在使用它)和 Xcode12,以便我们可以测试 iOS14 功能。
    【解决方案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 语句,但没有多余的代码。

    【讨论】:

      【解决方案3】:

      这个怎么样?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        相关资源
        最近更新 更多