奇怪地显示“无法使用类型'([SomeClass.Type])'的参数列表调用'someFunction'”编译时错误

问题描述 投票:0回答:1

当我在做一些研究并改进我的代码时,我偶然发现了一些非常奇怪的行为。即使我创建了一个名为someFunction的函数,该函数接受[SomeClass.Type]作为参数,它仍显示以下错误:

Cannot invoke 'someFunction' with an argument list of type '([SomeClass.Type])

也许是Xcode或Swift编译器中的错误。也许对我来说太复杂了。这是情况:

  1. 我有一个协议说SomeProtocol。它不继承任何东西。
  2. 我有一个符合该协议的类,例如SomeClass
  3. 我有两个从此类继承的子类,例如SomeSubClass1SomeSubClass2
  4. 我有一个接受[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)

为什么会这样?如何解决此问题?

swift class inheritance protocols
1个回答
0
投票
someFunction([SomeSubClass1.self, SomeSubClass2.self] as [SomeClass.Type])

在上述情况下,类型推断很可能无法按预期工作。在进一步的测试中,我注意到以下代码也可以很好地编译:

func someFunction<T: SomeClass>(_ cellClass: [T]) { }

someFunction([SomeSubClass1(), SomeSubClass2()])

因此,如果这篇文章引起足够的关注,我们很有可能在将来会期望迅速的编译器团队提供修复。保持编码👍🏻。

© www.soinside.com 2019 - 2024. All rights reserved.