通过自定义协议符合 MKAnnotation 协议

2023-12-11

我想轻松地在地图上获取 2 个或更多不同的对象类型。 Swift 2.0,我想使用协议。

我创建了一个这些对象也需要遵守的协议。我假设现在任何符合 PinProtocol 的项目本质上与 MKAnnotation 相同......只是更多!

protocol PinProtocol: MKAnnotation {
    // stuff
}

我有 2 个班级,员工和客户

两者都符合 PinProtocol(还需要符合 MKAnnotation)

我知道这很有效,就像我这样设置我的班级一样,

class Client: NSObject, PinProtocol {
     //var coordinate:CLLocationCoordinate2D // Leave out get doesn't conform to protocol warning as expected
}

因此,这告诉我 PinProtocol 正在按预期工作,因为需要遵守 PinProtocol 的项目也符合 MKAnnotation 协议。因为 MKAnnotation 需要坐标:CLLocationCooperative2D。

那么为什么我会遇到这个问题

let staffAndClients = [PinProtocol]()

mapView.addAnnotations(staffAndClients) // not allowed!
//mapView.addAnnotations(pins as! [MKAnnotation]) // also not allowed

错误是,无法将 [PinProtocol] 类型的值转换为预期参数 [MKAnnotation]

PinProtocol 不符合 MKAnnotation 所以应该可以工作。

但这样做效果很好

let staff = [Staff]()
mapView.addAnnotations(staff) // no problem
let clients = [Client]()
mapView.addAnnotations(clients) // no problem

我可以使用 AnyObject 解决这个问题,但为什么我不能使用 PinProtocol - 对我来说,这看起来更干净,并且是协议扩展的整个想法。

谢谢你的帮助。

Addit...

对于那些面临类似问题的人来说,我解决这个问题的方法是

var pins = [AnyObject]()
mapView.addAnnotations(pins as! [MKAnnotation])

考虑protocol作为模板,您可以使用该模板来制作一些有用的内容,例如学校演示文稿,但您不能将模板本身用于任何演示文稿。

这是因为协议缺少方法或属性的实现。要真正获得该特定协议的对象,需要实现这些方法。在这种情况下,Java 允许您匿名子类化协议,并强制您实现所需的方法。 (Java 称之为interface,不要混淆它 Objective-Cinterface)

与 java 不同,Swift 不支持创建匿名子类,因此任何本身就是协议的类都无法在 Objective-C 和 Swift 中创建对象。实例化它们的唯一方法是获取另一个class (interface在 Objective C 中)符合该协议并创建该特定类的实例,Staff and Client在你的情况下。但是,您可以使用协议类型的变量,如下所示:

let staff = [PinProtocol]() //PinProtocol type array. can hold any type of objects that conform to this protocol

staff在这种情况下是Array类型的PinProtocol,它不知道有关创建的对象的任何其他信息。

Edit:

我刚刚正确理解了你的问题。是的,我们可以在 swift 中声明一个类型数组protocol名称。该数组可以保存符合协议的类的对象。您声明数组的语法是正确的。

let staffAndClients = [PinProtocol]()

关于错误错误是,无法转换类型的值[PinProtocol]到预期的论点[MKAnnotation]我查看了文档,发现该方法addAnnotations()需要数组AnyObject如下:

func addAnnotations(annotations: [AnyObject]!) //in MKMapView 

现在棘手的部分是,MKAnnotation不继承自AnyObject,而是从NSObjectProtocol ie:

protocol MKAnnotation : NSObjectProtocol

Whereas AnyObject也继承自NSObjectProtocol,使其成为兄弟姐妹MKAnnotation这就是为什么你会收到错误,因为你不能传递类型为MKAnnotation,因为他们不是AnyObject在他们的父层次结构中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过自定义协议符合 MKAnnotation 协议 的相关文章

随机推荐

  • 通过引用返回。返回变量周围的括号

    http php net manual en function return php 通过引用返回时 切勿在返回变量周围使用括号 因为这是行不通的 您只能通过引用返回变量 而不能返回语句的结果 如果使用 return a 那么你返回的不是变
  • 获取 Javascript 中其他位置的偏移量

    我在亚洲 我想计算澳大利亚的偏移量 我知道如何计算偏移量的值 代码如下 var timezone offset new Date getTimezoneOffset 但其他地点如何计算呢 有人可以指导我吗 虽然这can如果要在一个简短的函数
  • 在linux终端中编译c++文件:string_view:没有这样的文件或目录

    我有 gcc Cadence 4 8 3 我想编译一个包含 string view 的 C 文件 当我编译文件时 g script cpp 出现以下错误 script cpp 4 23 fatal error string view No
  • Android - 使用push()插入多个标记

    我可以在地图上插入多个标记 但是 当我插入 Firebase 数据库时 只有最后放置的标记被插入 我想我必须使用某种列表或哈希图 POJO类 public class FirebaseMarker String address String
  • 在 python 脚本中使用 youtube-dl 仅从 youtube 视频下载音频

    有一个few posts on 下载音频来自 YouTube 使用youtube dl 但没有一个是具体的或太有帮助的 我想知道从 Python 脚本中执行此操作的最佳方法是什么 例如 以下是下载视频的 README 示例 import y
  • Python - 沃尔玛的网络抓取

    我正在尝试从中获取一些数据Walmart使用 Python 和 BeautifulSoupbs4 简而言之 我编写了一段代码来获取所有类别名称并且有效 import requests from bs4 import BeautifulSou
  • 启动前为进程设置环境变量

    我有以下情况 我有 Mac OS 捆绑包 其中包含使用一些第三方动态库的应用程序 这些库依赖于一些环境变量 让我们命名它ENV VAR 我想设置ENV VAR仅对我的应用程序具有某些值 因为如果我为整个系统设置它 可能会破坏其他一些应用程序
  • 通过 jQuery 发布数组

    我有一个表单 其中包含一些唯一的输入字段和一些具有重复名称的其他字段 如下所示
  • 如何为 Core Data 中的二进制数据启用外部存储

    我想使用 iOS 5 附带的新的外部二进制数据作为核心数据 我已经看过有关它的文章 例如 http bluecrowbar com blog 2011 08 coredata external html 除了告诉您选中 允许外部存储 框之外
  • 使用 Java 将文本复制到剪贴板

    我想从 a 复制文本JTable的单元格复制到剪贴板 使其可以粘贴到其他程序中 例如 Microsoft Word 我有来自JTable 但我不确定如何将其复制到剪贴板 这对我有用并且非常简单 导入这些 import java awt da
  • 如何检测用户现有订阅的价格是否已更改(Google Play 应用内购买)?

    Google 有文档说明如果订阅价格发生变化该怎么办 您应该使用计费客户端并启动PriceChangeConfirmationFlow 但是 您如何首先检测价格是否发生变化 哪个 Android 库 API 会告诉我这一点 SkuDetai
  • 在 Printf 模块中输入

    在文件中打印模块 不太明白其中的机制 a out channel unit format 我想我在实践中经常使用它 例如 以下函数在编译时可以很好地键入 type t x int y int let print chan out chann
  • Balanced_accuracy 不是 scikit-learn 中的有效评分值

    与这篇文章超级相似 ValueError balanced accuracy 不是 scikit learn 中的有效评分值 我在用 scoring precision macro recall macro balanced accurac
  • Android:自定义相机拍摄的图像太暗

    在我的应用程序中 我必须拍摄自定义活动的照片 我实现了所有功能并且可以保存我的照片 但在某些设备中它们太暗了 我有这段代码 但它对我没有帮助 Parameters params mCamera getParameters if params
  • Clock() - C 函数的执行时间

    我正在尝试测量 C 代码块的执行时间 我的代码中有类似这样的内容 clock t begin end double time spent begin clock ATL dsymv 122 n alfa A n X 1 beta Y 1 e
  • 在 powershell 中聚焦 IE 窗口

    My code ie new object com InternetExplorer Application ie navigate http localhost ie visible true ie fullscreen true 但是全
  • 如何在 RMI 方法的参数中传递对象?

    我正在尝试在 RMI 方法中添加参数 当我添加例如String一切正常 但我不确定是否可以传递我创建的对象 我是 RMI 新手 所以我的代码非常简单 HelloIF public interface HelloIF extends Remo
  • 尝试使用 JavaScript 从 azure 获取访问令牌时无法加载响应数据

    我想为我在 azure 上注册的应用程序获取访问令牌 为此 我编写了一段代码来访问其余 API 这是我的代码
  • 数据透视表字段显示除空白之外的所有内容

    我需要在刷新后更新数据透视过滤器以选择除blank 这里的其他答案利用 ShowAllItems方法对我不起作用 因为它也会显示没有数据的项目 下面的枢轴选项Display 我尝试使用在另一个问题上找到的另一个解决方案 PivotItems
  • 通过自定义协议符合 MKAnnotation 协议

    我想轻松地在地图上获取 2 个或更多不同的对象类型 Swift 2 0 我想使用协议 我创建了一个这些对象也需要遵守的协议 我假设现在任何符合 PinProtocol 的项目本质上与 MKAnnotation 相同 只是更多 protoco