Ios 如何在Swift中将类型方法添加到泛型类型?
我试图在Swift中向泛型类添加一个类型(也称为静态)方法。这是代码Ios 如何在Swift中将类型方法添加到泛型类型?,ios,swift,generics,Ios,Swift,Generics,我试图在Swift中向泛型类添加一个类型(也称为静态)方法。这是代码 class StateArchive<T> { class func emptyAllArchives() { // do something } } // the compiler emits an error: "Argument for generic parameter 'T' could not be inferred" StateArchive.emptyAllArch
class StateArchive<T> {
class func emptyAllArchives() {
// do something
}
}
// the compiler emits an error: "Argument for generic parameter 'T' could not be inferred"
StateArchive.emptyAllArchives()
类状态存档{
类func emptyAllArchives(){
//做点什么
}
}
//编译器发出错误:“无法推断泛型参数“T”的参数”
StateArchive.emptyAllArchives()
我可以通过提供类型来代替T来编译上述代码,如下所示:
StateArchive.emptyAllArchives()
然而,这看起来很尴尬。起初,我认为这样做的原因可能是可以创建一个类型为T的类变量。在操场上进行的快速测试显示,编译器发出一条消息说:
“泛型类型中尚不支持类存储属性”
是否有人知道如何在泛型类型中创建类型方法,并让客户端调用此方法,而不提供类型来代替T?当遇到泛型问题时,如果泛型的工作方式与预期的工作方式不一样,则可以帮助理解该问题,思考如果用不同的具体类型替换占位符会发生什么 因此,例如,假设您定义了以下内容(由于您给出的原因,这不会编译,但假设它确实编译了):
C类{
静态变量a:[T]=[]
静态函数加法(i:T){
a、 附加(i)
}
}
实际上,当您编写类C
时,您并不是在编写类。您正在为无限多个可能的类编写蓝图–C
,C
,C
在这种情况下,假设您编写了C.addElement(1)
,那么T
将是Int
。然后,您编写了C.addElement(“one”)
。C.a
现在包含一项还是两项?a
的类型是什么
最合理的答案可能是,有一个C.a
和一个C.a
和一个C.a
和一个元素。但这可能会让人非常困惑,而且似乎没有用例来证明这种功能的合理性
一般来说,静态方法和属性最好很少使用,您可能会发现使用非静态成员和方法以及单例模式(甚至可能不是这样)会更好。如果仍然需要类似于静态的函数,那么最好使用泛型自由函数(例如
func emptyArchive(c:c){}
)。另一个答案的解释是正确的,但事实上,您可以通过这一点获得直观预期的行为:
extension StateArchive where T == Any {
static func emptyAllArchives() {
// do something
}
}
// works as expected
StateArchive.emptyAllArchives()
如果您在
emptyAllArchives
方法中使用t
而不为t
提供类型,那么在不提供类型的情况下调用该静态函数是没有意义的。我不知道您可以在静态函数中访问t。现在可以理解为什么需要指定T的类型。谢谢!你所描述的有道理。谢谢你帮我把这件事弄清楚。我最终创建了一个单独的非泛型类,并让它实现我需要的静态函数。这是可行的,因为我不访问任何静态函数中的t。
extension StateArchive where T == Any {
static func emptyAllArchives() {
// do something
}
}
// works as expected
StateArchive.emptyAllArchives()