如何将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) { }
)。