如何将子class改名为class? / 'MKPinAnnotationView' 在 iOS 15.0 中被弃用:重命名为“MKMarkerAnnotationView”

How to subclass a renamed class? / 'MKPinAnnotationView' was deprecated in iOS 15.0: renamed to 'MKMarkerAnnotationView‘

MKPinAnnotationView 在 iOS 15 中重命名为 MKMarkerAnnotationView
直到 iOS 14,我将 class 分 MKPinAnnotationView

class MyAnnotationView: MKPinAnnotationView {
// …
}  

问题:
如果我的应用程序编译为 iOS 14,我想声明 MyAnnotationView 如上。
但是,如果编译为 iOS 15,我必须使用

class MyAnnotationView: MKMarkerAnnotationView {
// …
}  

如何实现?

在指令级别,我可以使用类似

的东西
if #available(iOS 15, *) {
// iOS 15
} else {
// iOS 14
}  

但在 class 级别上,显然只有

@available(iOS 15, *)
class MyAnnotationView: MKMarkerAnnotationView {   

似乎可以让我编译 class 如果 iOS 15 可用,但显然我无法避免编译 class MyAnnotationView: MKPinAnnotationView { 如果 iOS 15 可用.

那么 Swift 是如何处理的?

正如 @Paulw11 在其他回答中指出的那样,MKMarkerAnnotationViewiOS 11 以来可用。因此无需 iOS 15 即可使用它。


这部分仍然与其他情况相关,例如 @dfdiOS 14 和更早版本中提到的图像选择器。


没有想象中那么漂亮,但还是值得一试。

import MapKit

#if canImport(CoreLocationUI) // Hack for iOS 15?
public typealias BaseAnnotationView = MKMarkerAnnotationView
#else
public typealias BaseAnnotationView = MKPinAnnotationView
#endif

class MyAnnotationView: BaseAnnotationView {
    
}

MKPinAnnotationView 尚未重命名。

MKPinAnnotationView 在 iOS 15 中 已弃用 ,但您仍然可以使用它。弃用只是意味着不建议您将它用于新应用程序,它可能会在未来消失并且您不能期待任何增强。

MKMarkerAnnotationView 从 iOS 11 开始可用,因此除非您的应用针对 iOS 10 或更早版本,否则您可以简单地切换到使用它而不是 MKPinAnnotationView