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
类型addnewcase
,如何在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的特性。