Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中将类型方法添加到泛型类型?_Ios_Swift_Generics - Fatal编程技术网

Ios 如何在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

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

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()