如何在Swift中检查关联类型协议的一致性?

6

当我想检查一个类型是否符合简单协议时,我可以使用以下代码:

if let type = ValueType.self as? Codable.Type {}

当协议有关联类型时,例如RawRepresentableRawValue, 当我这样做:

if let type = ValueType.self as? RawRepresentable.Type {}

编译器会显示以下错误:
“协议‘RawRepresentable’只能用作通用约束,因为它具有Self或相关类型要求”。
那么如何检查符合带有关联类型的协议呢?

常识问题...在您的“ValueType”情况下,“RawValue”是什么? :) - Dominik Bucher
1
这种检查听起来很 Objective-C。在像 Swift 这样的强类型语言中,类型应该在编译时进行检查。 - vadian
@DominikBucher 我想它可以是任何类型。 - duan
1个回答

5

简而言之:
编译器在关联类型设置前缺乏足够的信息来比较类型。


当您引用简单协议时,编译器从一开始就知道其类型。 但是,当您引用具有关联类型的协议时,编译器直到您声明它才知道其类型。

protocol ExampleProtocol {
    associatedtype SomeType
    func foo(param: SomeType)
}

在编译器看来,此时看起来像这样:
protocol ExampleProtocol {
    func foo(param: <I don't know it, so I'll wait until it's defined>)
}

当您声明一个符合协议的类时

class A: ExampleProtocol {
    typealias SomeType = String
    func foo(param: SomeType) {

    }
}

编译器开始看待它的方式如下:
protocol ExampleProtocol {
    func foo(param: String)
}

然后它就可以比较类型了。


在SwiftUI中,我们如何检查Color是否是View?你能向我展示如何用Swift实现吗?谢谢。 - lochiwei
那么,我们如何检查一个 Rectangle 是否是一个 View - lochiwei
@lochiwei,矩形是视图内的一种形状。 - fewlinesofcode
我的意思是Rectangle符合InsettableShapeInsettableShape继承自Shape,而Shape又继承自View,那么我们如何在代码中检查Rectangle是否为View - lochiwei
@lochiwei 不是继承,因为它全部都是结构体而不是类,更好的术语应该是“符合”。 - txaidw
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接