【问题标题】:Swift generic type check protocol conformanceSwift 泛型类型检查协议一致性
【发布时间】:2021-10-13 04:57:14
【问题描述】:

假设我有 2 个 swift 协议:

protocol A: AnyObject {}

protocol B: A {}

在泛型函数上,我想检索传递的类型T 是否符合协议A

    func method<T>(_ type: T.Type) -> Bool {
        return T.self is A.Protocol // A.Type fails always
    }

在前一种方法中,如果我发送类型 A 一切正常,但如果我尝试发送符合 B 的类型,则会失败。由于 B 已经符合 A,因此预期结果将为真。

有没有办法实现这个逻辑?

提前致谢。

【问题讨论】:

  • ...可以符合协议... 在运行时检查非常unswifty。写method&lt;T : A&gt;然后你在编译时得到检查
  • A.Type 应该在这里工作。你能显示minimal reproducible exampleA.Type 失败吗?无论如何,为什么不在编译时检查它(见乔治的回答)?
  • 是的,我已经检查了 Georges 的答案(并添加了评论)如果您尝试传递符合 A 或 B 的类类型,一切正常,但假设您想将协议 B 作为类型传递, 乔治的回答行不通

标签: swift generics protocols


【解决方案1】:

这是实现此目的的一种方法:

protocol A: AnyObject {}
protocol B: A {}

func method<T>(_ type: T.Type) -> Bool {
    return false
}
func method<T: A>(_ type: T.Type) -> Bool {
    return true
}


class Temp1: A {}
class Temp2: B {}
class Temp3 {}

print(method(Temp1.self)) // true
print(method(Temp2.self)) // true
print(method(Temp3.self)) // false

写两个相同的方法,除了一个有泛型&lt;T&gt;,另一个是&lt;T: A&gt;。在此示例中,Temp1Temp2 将使用 &lt;T: A&gt; 方法,而 Temp3 将仅使用 &lt;T&gt; 方法,因为它不符合 A

【讨论】:

  • 巧妙的重载用法,我喜欢!
  • 感谢@George 的超快速响应,但在您的示例中,如果我想将method(B.self) 作为参数传递,结果将是false。发送协议类型时似乎没有类型推断。
  • @AlbertoGarcía 给它一个类型协议是没有意义的。它们是不同的东西——可能有比这更好的方法来构建你的代码。
  • 注意,这种方法也很脆弱。 gist.github.com/rnapier/638fb92523dc6d0ba8392bc0a62f4030
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
相关资源
最近更新 更多