ios - Swift 扩展类型约束
问题描述
XCode 11.2.1
macOS 莫哈韦 10.14.6
因此,如果我保留了引用,我正在尝试添加从数组中删除对象的功能。遵循互联网建议,我使我的协议继承自AnyObject
,因为这会导致/要求/暗示===
在任何实现该协议的类上定义。但是,XCode 对 Array 扩展上的类型表现得很奇怪。考虑以下编译良好:
public protocol Foo: AnyObject {
}
public extension Array where Element == Foo {
mutating func removeElement(element: Element) {
if let idx = self.firstIndex(where: {$0 === element}) {
self.remove(at: idx)
}
}
}
public func bar(array: [Foo], element: Foo) -> [Foo] {
var arrayCopy: [Foo] = array
arrayCopy.removeElement(element: element)
return arrayCopy
}
但是如果我将扩展类型更改为Element: AnyObject
,我会收到如下编译错误:
...
public extension Array where Element: AnyObject {
...
...
// Compiler error: '[Foo]' requires that 'Foo' conform to 'AnyObject'
arrayCopy.removeElement(element: element)
...
Foo
符合AnyObject
. 它就在它的定义中。为什么 XCode 不承认这一点?
解决方案
您使用的是旧软件,因此您不会收到现代错误消息:
在 'Array' 上引用实例方法 'removeElement(element:)' 要求 'Foo' 是类类型
这是真的。element
就编译器的理解而言,它不是静态类型的实例,但如果您这样编写它,它将是:
public func bar<Foo: Module.Foo>(array: [Foo], element: Foo) -> [Foo] {
Module
当然,您的模块的实际名称在哪里。
如果您需要使用异构数组,那么我不知道如何使事情变得比这更干净。如果你想得更好,请告诉我。
(保持函数的签名相同;改为更改主体。)
var arrayCopy: [AnyObject] = array
arrayCopy.removeElement(element: element)
return arrayCopy as! [Foo]
推荐阅读
- ios - UIStackView 中标签的内容拥抱和压缩问题设置
- google-cloud-platform - 为 Integromat 设置 GCP VPC
- sql - 有没有办法使用 SQL 定义使用 2 个非唯一列的 2 个表之间的关系
- javascript - How can I share methods that call P5.js functions between two different sketches/canvases?
- nginx - 处理 nginx 中的 lua 错误并渲染 500 页面
- r - 如何使用 prop.table 创建数据集?
- css - 将 CSS 样式表注入 YouTube 页面时出现问题
- python - 在 Python 中使用超出索引的查询集编写 If 语句的最佳方法?
- vue.js - Microsoft 的 Graph API 请求产生不正确的标头
- html - 我们如何从 github 链接中知道 csv 的来源