如何使非类类型符合类协议?

Posted

技术标签:

【中文标题】如何使非类类型符合类协议?【英文标题】:How to make a non-class type conform to a class protocol? 【发布时间】:2020-11-19 00:52:18 【问题描述】:

例如,我怎样才能使 MapView,它是一个 'struct' 类型符合 CLLocationManagerDelegate,它的协议需要一个 'class' 类型?

Code Block 
struct  MapView: UIViewRepresentable, CLLocationManagerDelegate 
    var coordinate: CLLocationCoordinate2D
    func makeUIView(context: Context) -> MKMapView 
        MKMapView(frame: .zero)
    
    func updateUIView(_ uiView: MKMapView, context: Context) 
        let span = MKCoordinateSpan(latitudeDelta: 0.0019, longitudeDelta: 0.0019)
        let region = MKCoordinateRegion(center: coordinate, span: span)
        uiView.setRegion(region, animated: true)
        uiView.mapType = .hybridFlyover
    

【问题讨论】:

你不能写一个类,让那个类成为结构体的成员? 【参考方案1】:

CLLocationManagerDelegate 的协议已设置为类型类,由苹果公司制作。因此我们无法改变它。你有什么理由想让它成为一个结构而不是一个类?

【讨论】:

当我添加代码 var showsUserLocation = trueMapView.showsUserLocation = true 它给我一个错误 Instance member 'showsUserLocation' cannot be used on type 'MapView'; did you mean to use a value of this type instead? 。我在想我必须将 MapView 从 Struct 类型更改为 Class 类型/【参考方案2】:

正如其他人所指出的,您不能,但在这种情况下,原因尤为重要。视图一直在创建和销毁;他们只是价值观。委托是一个特定的对象。 View 无法扮演委托的角色。 CLLocationManager 将拥有一个副本,而您将在视图层次结构中查看另一个副本。相反,您需要创建一些其他对象,很可能是一个 ObservableObject,它会跟踪您需要的任何位置信息,并且 View 会观察到这一点。

【讨论】:

以上是关于如何使非类类型符合类协议?的主要内容,如果未能解决你的问题,请参考以下文章

如何将符合协议的类声明为参数类型?

“类型‘()’不能符合‘视图’;只有结构/枚举/类类型可以符合协议”

类型“Favorites.Type”不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

协议类型“Encodable”的值不能符合“Encodable”;只有结构/枚举/类类型可以符合协议

请帮忙:类型'()'不能符合'View';只有结构/枚举/类类型可以符合协议

使用 if 语句时:类型 '()' 不能符合 'View';只有结构/枚举/类类型可以符合协议