“符合协议的类的类型”作为swift方法中的参数

au9on6nz  于 2023-03-11  发布在  Swift
关注(0)|答案(2)|浏览(180)

问题

我想在一个特定的类中创建一个泛型方法,在那里我可以调用另一个基于目标(符合特定协议)的类,可以执行某些计算。
如果我显式定义它是什么类型的目标,它可以正常工作,但是如果我想把它作为符合特定协议的类型传递,我就会遇到麻烦。

不清楚不要读

我有一个方案和一个符合该方案的类,如下所示:

protocol MyProtocol {
    func someFunc()
}

class ConformingClass: MyProtocol {
    func someFunc() {
        // Do something
    }
}

我需要使用一个类:

class SomeClass<N: MyProtocol> {
    class func doSomething() {
        // Do something
    }
}

这是我的类,我想在其中使用SomeClass,但它的类型将被定义为下面方法的参数:

class MyClass {
    func doStuff<C: MyProtocol>(target: C.Type) {
        SomeClass<target>.doSomething
    }
}

问题

编译错误:“target”不是类型

问题

当我明确地说参数是一个符合MyProtocolType时,这个错误怎么可能发生呢?我在这里做错了什么?
我正在使用Swift 2.3Xcode 7.3.1

piah890a

piah890a1#

在你的代码中target包含了一个“运行时类型对象”,并且你不能使用泛型类型参数,你知道你不能这样做:

func doStuff<C: MyProtocol>(target: C.Type) {
    var c: target? //<- This is illegal. You cannot use `target` where a "type" is needed.
}

你为什么不把它写成:

func doStuff<C: MyProtocol>(target: C.Type) {
    SomeClass<C>.doSomething()
}

您可以将其用作:

myObj.doStuff(ConformingClass.self)
nkoocmlb

nkoocmlb2#

现代方法:

func doStuff(target: any MyProtocol.Type) {
    target.doSomething()
}

您还可以将CollectionArraySet等)与any一起使用,以混合匹配符合类型:

func doStuff(targets: any Collection<any MyProtocol.Type>) {
    targets.forEach { target in
        target.doSomething()
    }
}

假设你有类AB,它们都符合MyProtocol,它们可以在同一个集合中传递,比如:

doStuff(targets: [A.self, B.self])

相关问题