如何使非类类型符合类协议?
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 = true
和 MapView.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”;只有结构/枚举/类类型可以符合协议