如果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版本中调用。
答案 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 {
}