Swift 扩展类型限制
Swift extension type constraints
XCode 11.2.1
macOS 莫哈韦沙漠 10.14.6
因此,如果我保留了引用,我将尝试添加从数组中删除对象的功能。根据 Internet 的建议,我已经使我的协议继承自 AnyObject
,因为这个 causes/requires/implies ===
被定义在任何实现该协议的 类 上。但是,XCode 对 Array 扩展上的类型表现得很奇怪。考虑以下编译正常:
public protocol Foo: AnyObject {
}
public extension Array where Element == Foo {
mutating func removeElement(element: Element) {
if let idx = self.firstIndex(where: {[=11=] === 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 不承认这一点?
您使用的是旧软件,因此不会收到现代错误消息:
Referencing instance method 'removeElement(element:)' on 'Array'
requires that 'Foo' be a class type
这是真的。据编译器理解,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]
XCode 11.2.1
macOS 莫哈韦沙漠 10.14.6
因此,如果我保留了引用,我将尝试添加从数组中删除对象的功能。根据 Internet 的建议,我已经使我的协议继承自 AnyObject
,因为这个 causes/requires/implies ===
被定义在任何实现该协议的 类 上。但是,XCode 对 Array 扩展上的类型表现得很奇怪。考虑以下编译正常:
public protocol Foo: AnyObject {
}
public extension Array where Element == Foo {
mutating func removeElement(element: Element) {
if let idx = self.firstIndex(where: {[=11=] === 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 不承认这一点?
您使用的是旧软件,因此不会收到现代错误消息:
Referencing instance method 'removeElement(element:)' on 'Array' requires that 'Foo' be a class type
这是真的。据编译器理解,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]