如何在Swift中向泛型类型添加类型方法?

Max*_*axK 1 generics ios swift

我试图在Swift中向泛型类添加一个类型(aka静态)方法.这是代码.

class StateArchive<T> {
    class func emptyAllArchives() {
        // do something
    }
}

// the compiler emits an error: "Argument for generic parameter 'T' could not be inferred"
StateArchive.emptyAllArchives()
Run Code Online (Sandbox Code Playgroud)

我可以通过提供代替T的类型来编译上面的代码,如下所示:

StateArchive<AnyObject>.emptyAllArchives()

然而,这看起来很尴尬.最初我认为原因可能是人们可以创建一个类型为T的类变量.在操场上进行的快速测试显示编译器会发出一条消息:

"泛型类型尚不支持的类存储属性".

有没有人知道如何在泛型类型中创建一个类型方法,让客户端调用此方法而不提供代替T的类型?

Air*_*ity 7

当遇到泛型不能正常工作的问题时,通常会有用,帮助理解问题,思考如果用不同的具体类型替换占位符会发生什么.

因此,例如,假设您定义了以下内容(由于您给出的原因,这不会编译,但想象一下):

class C<T> {
    static var a: [T] = []

    static func addElement(i: T) {
        a.append(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

真的,当你写作时class C<T>,你不是在写一堂课.你写了一个蓝图可能类别无限数量的- ,C<Int>,.C<String>C<AnythingElse>

在这种情况下,假设你写了C.addElement(1)- 那T就是Int.然后,你写了C.addElement("one").将C.a现在包含一个项目,还是两个?那种类型a是什么?

可能最合理的答案是会有C<Int>.a一个元素,C<String>.a一个元素.但这可能会让人感到非常困惑,并且似乎没有用例来证明这种功能的合理性.

通常,静态方法和属性最好很少使用,并且您可能会发现最好使用非静态成员和方法,并结合单例模式(或者甚至不是这样).如果您仍然需要类似静态的函数,那么最好使用通用的自由函数(例如func emptyArchive<T: C>(c: C) { }).