Swift 初始化类时将类类型存储为属性
我想知道是否可以在类的init中传递一个符合协议的类型,并将该类型保存为属性,以便在类的另一个函数上使用它 我想我可以在我的Swift 初始化类时将类类型存储为属性,swift,generics,Swift,Generics,我想知道是否可以在类的init中传递一个符合协议的类型,并将该类型保存为属性,以便在类的另一个函数上使用它 我想我可以在我的run函数中传递这个泛型类型,但我更希望不这样做 protocol example { static func exampleFunc() } class MyClass { init(type: TypeThatConformsToExampleProtocol) { // can i save `type` as a propert
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是的,我是说静态的,对不起。谢谢你的回答,如果协议中定义的方法是静态的
,该怎么办。我忘了指定它是静态的,很抱歉,我会在以后处理这个问题