Swift 初始化类时将类类型存储为属性

Swift 初始化类时将类类型存储为属性,swift,generics,Swift,Generics,我想知道是否可以在类的init中传递一个符合协议的类型,并将该类型保存为属性,以便在类的另一个函数上使用它 我想我可以在我的run函数中传递这个泛型类型,但我更希望不这样做 protocol example { static func exampleFunc() } class MyClass { init(type: TypeThatConformsToExampleProtocol) { // can i save `type` as a propert

我想知道是否可以在类的init中传递一个符合协议的类型,并将该类型保存为属性,以便在类的另一个函数上使用它

我想我可以在我的
run
函数中传递这个泛型类型,但我更希望不这样做

protocol example {
    static func exampleFunc()
}


class MyClass {

    init(type: TypeThatConformsToExampleProtocol) {
        // can i save `type` as a property and use it in my `run` function to call exampleFunc ?
    }

    func run() {
        type.exampleFunc()
    } 
}

编辑:我已经编辑了协议,并使方法
静态
我之前忘记添加它。

您的问题中有两件事。您请求的内容,存储类型,以及在您提供的代码中对该类型所做的操作

你能储存这个型号吗? 对。但是您必须使
MyClass
通用

class-MyClass{
let类型:T.类型
init(类型:T.type){
self.type=type
}
}
这样做没有什么好处,因为您的类将专门处理
T
类型,所以您可以只参考
T
。你不需要储存它

您可以创建一个泛型初始值设定项,而不是将类设置为泛型,然后将类型强制转换为
(或者可能是
AnyType
——我忘记了),然后在您的示例中,将其强制转换为
作为示例。self
。但是你用它做不了什么有用的事

如何执行示例代码尝试执行的操作 您的示例代码在任何情况下都不起作用,因为
exampleFunc
是一个实例方法,所以您需要的是该类型的实例,而不是该类型本身

幸运的是,有一种方法可以实现您的代码似乎想要做的事情,并且由于示例协议没有
Self
associatedtype
约束,因此更容易实现

class-MyClass{
让我们举个例子
init(\uExampleInstance:example){
self.exampleInstance=exampleInstance
}
func run(){
exampleInstance.exampleFunc()
}
}
那么
静态
方法呢?
自然的后续问题可能是,“好的,那么我可以用协议的静态方法做同样的事情吗?”。答案是肯定的,但略有不同。首先修改协议,要求一致性类型采用静态方法:

协议示例
{
func exampleFunc()
静态函数staticRun()
}
有两种方法(也许不止是不要马上想到的方法)。第一个是让你的类回到泛型。如果这样做,您甚至不需要初始值设定项:

class-MyClass
{
func run(){
T.staticRun()
}
}
第二种方法将通用部分移动到初始值设定项,而不是
。在这种情况下,您可以存储一个闭包:

class-MyClass
{
让runClosure:()->Void
init(类型:T.type){
self.runClosure={T.staticRun()}
}
func run(){
runClosure()
}
}

你的问题中有两件事。您请求的内容,存储类型,以及在您提供的代码中对该类型所做的操作

你能储存这个型号吗? 对。但是您必须使
MyClass
通用

class-MyClass{
let类型:T.类型
init(类型:T.type){
self.type=type
}
}
这样做没有什么好处,因为您的类将专门处理
T
类型,所以您可以只参考
T
。你不需要储存它

您可以创建一个泛型初始值设定项,而不是将类设置为泛型,然后将类型强制转换为
(或者可能是
AnyType
——我忘记了),然后在您的示例中,将其强制转换为
作为示例。self
。但是你用它做不了什么有用的事

如何执行示例代码尝试执行的操作 您的示例代码在任何情况下都不起作用,因为
exampleFunc
是一个实例方法,所以您需要的是该类型的实例,而不是该类型本身

幸运的是,有一种方法可以实现您的代码似乎想要做的事情,并且由于示例协议没有
Self
associatedtype
约束,因此更容易实现

class-MyClass{
让我们举个例子
init(\uExampleInstance:example){
self.exampleInstance=exampleInstance
}
func run(){
exampleInstance.exampleFunc()
}
}
那么
静态
方法呢?
自然的后续问题可能是,“好的,那么我可以用协议的静态方法做同样的事情吗?”。答案是肯定的,但略有不同。首先修改协议,要求一致性类型采用静态方法:

协议示例
{
func exampleFunc()
静态函数staticRun()
}
有两种方法(也许不止是不要马上想到的方法)。第一个是让你的类回到泛型。如果这样做,您甚至不需要初始值设定项:

class-MyClass
{
func run(){
T.staticRun()
}
}
第二种方法将通用部分移动到初始值设定项,而不是
。在这种情况下,您可以存储一个闭包:

class-MyClass
{
让runClosure:()->Void
init(类型:T.type){
self.runClosure={T.staticRun()}
}
func run(){
runClosure()
}
}

在您的示例中,
exampleFunc()
是一个实例方法,而不是静态方法,因此您无法在类型本身上调用它。你的意思是让它静止吗?或者你是想传递一个值而不是一个类型?@RobNapier是的,我是说静态的,对不起。在你的例子中,
exampleFunc()
是一个实例方法,而不是静态方法,所以你不能对类型本身调用它。你的意思是让它静止吗?或者你是想传递一个值而不是一个类型?@RobNapier是的,我是说静态的,对不起。谢谢你的回答,如果协议中定义的方法是
静态的
,该怎么办。我忘了指定它是静态的,很抱歉,我会在以后处理这个问题