【问题标题】:Store class type as property when initializing class初始化类时将类类型存储为属性
【发布时间】:2021-04-02 18:10:37
【问题描述】:

我想知道是否可以在我的类的 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()
    } 
}

编辑:我已经编辑了协议并制作了方法static我忘了之前添加它。

【问题讨论】:

  • 在你的例子中,exampleFunc() 是一个实例方法,而不是一个静态方法,所以你不能在类型本身上调用它。你的意思是让它静态吗?还是您的意思是传递一个值而不是一个类型?
  • @RobNapier 是的,我的意思是静态的,抱歉。

标签: swift generics


【解决方案1】:

你的问题有两点。您要求的事情、存储类型以及您在提供的代码中对该类型执行的操作。

你能存储类型吗?

是的。但是你必须使MyClass 通用。

class MyClass<T: example> {

    let type: T.Type
    
    init(type: T.Type) {
        self.type = type
    }
}

这样做没有任何好处,因为您的课程将专门研究T 类型,因此您可以参考T。你不需要存储它。

您可以创建一个泛型初始化器而不是使类泛型,然后将类型转换为as Any(或者可能是AnyType - 我忘记了),然后在您的示例中将其转换为as example.self。不过,你不能用它做任何有用的事情。

如何执行您的示例代码尝试执行的操作

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

幸运的是,有一种方法可以完成您的代码似乎想要做的事情,并且由于您的示例协议没有 Selfassociatedtype 约束,它变得更容易。

class MyClass {

    let exampleInstance: example
    
    init(_ exampleInstance: example) {
        self.exampleInstance = exampleInstance
    }

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

static 方法呢?

很自然的后续问题可能是,“好的,我可以用协议的静态方法做同样的事情吗?”。答案是肯定的,但略有不同。首先修改协议,要求符合的类型有一个静态方法:

protocol example 
{
    func exampleFunc()
    static func staticRun()
}

有两种方法(可能不止是立即浮现在脑海中)。首先是回到让你的类通用化。如果你这样做,你甚至不需要初始化器:

class MyClass<T: example>
{
    func run() {
        T.staticRun()
    }
}

第二种方式将泛型部分移动到初始化器而不是class。在这种情况下,你存储一个闭包:

class MyClass
{
    let runClosure: () -> Void

    init<T: example>(type: T.Type) {
        self.runClosure = { T.staticRun() }
    }

    func run() {
        runClosure()
    }
}

【讨论】:

  • 感谢解答,如果协议中定义的方法是static怎么办。对不起,我忘了说明它是静态的。
  • 我稍后会处理这个案例,然后运行我的答案。 :-)
  • 太好了,这就是我要找的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2021-12-03
  • 2019-10-31
  • 2017-09-29
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多