【问题标题】:"Type of a class which conforms to a protocol" as parameter in a method swift“符合协议的类的类型”作为方法中的参数 swift
【发布时间】:2016-07-08 13:41:26
【问题描述】:

问题

我想在特定类中创建一个泛型方法,我可以 调用另一个基于 target 的类(其中 符合特定协议),可以进行一定的计算。

如果我明确定义它是什么类型的目标,它可以正常工作,但是 如果我想将它作为符合特定协议的类型传递,我 遇到麻烦了。

不清楚不要看

我有一个协议和一个符合它的类,如下所示:

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

【问题讨论】:

  • 短版:你不能。 Swift 目前不支持它。您需要将您需要的类的任何方面添加到协议中,或者您需要重新设计它。 Swift 3 中有一些工作可以让这个功能变得更强大。
  • @RobNapier 你说的可以正确回答,但我想知道这是怎么重复的?我不是在问如何放置符合协议的变量,而是在谈论无法识别的类型。
  • 同意,这实际上是一个不同的问题,而且不会很快得到解决。这是一个更通用的特性,称为更高种类的类型,Swift 没有并且目前不打算添加(尽管它已被广泛讨论)。您应该重新考虑您的方法,特别是从等式中删除类并改用类型擦除或传递的闭包。
  • @RobNapier 感谢您的评论 :) 实际上,我试图做的这种方法是由我用于对象映射的库强制执行的,我想让它更通用,但这很痛苦我做不到,也许我会尝试其他一些方法。

标签: ios swift


【解决方案1】:

在您的代码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)

【讨论】:

  • 感谢您的回答,这是一个非常好的解决方案。现在正在编译代码,我将测试功能,我认为它也可以工作:)
猜你喜欢
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多