【发布时间】:2016-07-08 13:41:26
【问题描述】:
问题
我想在特定类中创建一个泛型方法,我可以 调用另一个基于 target 的类(其中 符合特定协议),可以进行一定的计算。
如果我明确定义它是什么类型的目标,它可以正常工作,但是 如果我想将它作为符合特定协议的类型传递,我 遇到麻烦了。
不清楚不要看
我有一个协议和一个符合它的类,如下所示:
protocol MyProtocol {
func someFunc()
}
class ConformingClass: MyProtocol {
func someFunc() {
// Do something
}
}
我需要使用一个类:
class SomeClass<N: MyProtocol> {
class func doSomething() {
// Do something
}
}
还有我想使用 SomeClass 的类,但它的类型将定义为以下方法的参数:
class MyClass {
func doStuff<C: MyProtocol>(target: C.Type) {
SomeClass<target>.doSomething
}
}
问题
编译错误:'target' 不是类型
问题
当我明确表示参数是符合 MyProtocol 的 Type 时,怎么可能出现这种错误?我在这里做错了什么?
我正在使用 Swift 2.3 和 Xcode 7.3.1
【问题讨论】:
-
短版:你不能。 Swift 目前不支持它。您需要将您需要的类的任何方面添加到协议中,或者您需要重新设计它。 Swift 3 中有一些工作可以让这个功能变得更强大。
-
@RobNapier 你说的可以正确回答,但我想知道这是怎么重复的?我不是在问如何放置符合协议的变量,而是在谈论无法识别的类型。
-
同意,这实际上是一个不同的问题,而且不会很快得到解决。这是一个更通用的特性,称为更高种类的类型,Swift 没有并且目前不打算添加(尽管它已被广泛讨论)。您应该重新考虑您的方法,特别是从等式中删除类并改用类型擦除或传递的闭包。
-
@RobNapier 感谢您的评论 :) 实际上,我试图做的这种方法是由我用于对象映射的库强制执行的,我想让它更通用,但这很痛苦我做不到,也许我会尝试其他一些方法。