当我在做一些研究并改进我的代码时,我偶然发现了一些非常奇怪的行为。即使我创建了一个名为someFunction
的函数,该函数接受[SomeClass.Type]
作为参数,它仍显示以下错误:
Cannot invoke 'someFunction' with an argument list of type '([SomeClass.Type])
也许是Xcode或Swift编译器中的错误。也许对我来说太复杂了。这是情况:
SomeProtocol
。它不继承任何东西。SomeClass
。SomeSubClass1
和SomeSubClass2
。[SomeClass.Type]
作为参数的函数。import Foundation
protocol SomeProtocol { }
class SomeClass: SomeProtocol { }
func someFunction<T: SomeClass>(_ cellClass: [T.Type]) { }
class SomeSubClass1: SomeClass { }
class SomeSubClass2: SomeClass { }
现在出现了怪异的部分,如果以以下方式调用,someFunction
函数将不起作用:
someFunction([SomeSubClass1.self, SomeSubClass2.self])
这是什么奇怪的地方,以下所有行都可以完美地编译:
someFunction([SomeSubClass1.self])
someFunction([SomeSubClass2.self])
someFunction([SomeClass.self, SomeSubClass1.self, SomeSubClass2.self])
let classes = [SomeSubClass1.self, SomeSubClass2.self]
someFunction(classes)
为什么会这样?如何解决此问题?
someFunction([SomeSubClass1.self, SomeSubClass2.self] as [SomeClass.Type])
在上述情况下,类型推断很可能无法按预期工作。在进一步的测试中,我注意到以下代码也可以很好地编译:
func someFunction<T: SomeClass>(_ cellClass: [T]) { }
someFunction([SomeSubClass1(), SomeSubClass2()])
因此,如果这篇文章引起足够的关注,我们很有可能在将来会期望迅速的编译器团队提供修复。保持编码👍🏻。