如何将types方法添加到Swift中的genericstypes?

我想在Swift中添加一个types(aka静态)方法到generics类。 这是代码。

class StateArchive<T> { class func emptyAllArchives() { // do something } } // the compiler emits an error: "Argument for generic parameter 'T' could not be inferred" StateArchive.emptyAllArchives() 

我可以通过提供代替T的types来获得上面的代码来编译:

StateArchive<AnyObject>.emptyAllArchives()

但是,这看起来很尴尬。 起初,我认为这样做的原因可能是可以创build一个types为T的类variables。在操场上的一个快速testing显示,编译器发出一条消息:

“通用types尚不支持的类存储属性”。

有谁知道如何创build一个genericstypes的方法,并让客户端调用此方法,而不提供types的T代替?

当遇到一个不符合generics的问题时,这种方法通常是非常有用的,为了帮助理解问题,考虑如果用不同的具体typesreplace占位符,会发生什么情况。

所以举个例子,假设你定义了以下内容(这不会因为你给的原因而编译,但想象一下):

 class C<T> { static var a: [T] = [] static func addElement(i: T) { a.append(i) } } 

真的,当你写class C<T>时候,你不是在写课。 您正在编写无限数量的可能类的蓝图 – C<Int>C<String>C<AnythingElse>

在这种情况下,假设你写了C.addElement(1) – 所以T就是Int 。 然后,你写了C.addElement("one") 。 现在Ca会包含一个项目,还是两个? 是什么types的?

可能最合理的答案是会有一个C<Int>.a和一个元素,一个C<String>.a和一个元素。 但是这可能会变得非常混乱,似乎没有用例来certificate这种function。

一般来说,静态方法和属性很less被使用,你可能会发现你最好用非静态成员和方法,结合单例模式(或者甚至可能不是)。 如果仍然需要类似于静态的函数,那么最好使用一个通用的自由函数(例如func emptyArchive<T: C>(c: C) { } )。