Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 检查交换机语句中的可用性_Swift_Availability - Fatal编程技术网

Swift 检查交换机语句中的可用性

Swift 检查交换机语句中的可用性,swift,availability,Swift,Availability,如果在新操作系统版本中有Enum类型addnewcase,如何在switch语句中检查可用性 像下面StoreKit中的Enum public enum Code : Int { public typealias _ErrorType = SKError case unknown case clientInvalid case paymentCancelled case paymentInvalid case paymentNotAllowe

如果在新操作系统版本中有
Enum
类型addnew
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
        ...
    }
}
-----------------新的-------------------------


我认为这不是一个问题。如果不需要语句,则在一个
开关
中写入的所有情况都可以。因为新添加的案例不会在低iOS版本中调用。

我想您可以这样做:

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
            }
        }
    }
交换机事务代码{
案例SKError.unknown:
//手提箱
//(其余ios<9.3可用类型)
违约:
如果可用(iOS 9.3,*){
如果transactionCode==SKError.cloudServiceNetworkConnectionFailed{
//手提箱
}
否则,如果transactionCode==SKError.cloudServicePermissionDenied{
//手提箱
}
}
如果可用(iOS 10.3,*){
如果transactionCode==SKError.CloudServiceReversed{
//手提箱
}
}
}
如果没有默认情况,则无法生成详尽的switch语句,但没有冗余代码。

这如何

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 {

}

通常,它发生在新版本的Xcode上,带有新的SDK和工具链。 因此,例如,Xcode 12与iOS 14 SDK和Swift 5.3捆绑在一起,在新的情况下也有类似的问题,例如
PHAuthorizationStatus.limited
,它标记为仅在iOS 14中可用,并且它将在没有
默认值的情况下中断
开关
语句

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

切换PHPhotoLibrary.authorizationStatus(){
案例.授权:
presentImagePicker()
案件.驳回:
presentAccessDeniedAlert()
案例。未确定:
请求授权()
案例.限制性:
打破
#如果swift(>=5.3)//Xcode 12 iOS 14支持
凯斯有限公司:
presentImagePicker()
#恩迪夫
@未知默认值:
断言失败()
}

在UIUserInterfaceIdiom枚举中添加.Mac时遇到了这个问题。使用它来编译Xcode11(因为团队的大多数成员仍然在使用它)和Xcode12,这样我们就可以测试iOS14的特性。