(空)协议符合测试

(Empty) Protocol conforming test

这里有一点让我有点困惑。

我已经为测试目的定义了这个空协议:

protocol Doable {
}

协议为空,我希望任何可能的类型都符合它。

但是当我使用这段代码进行简单的协议符合性测试时,使用了两种方式。

if let _ = MyType.self as? Doable {
    print("Doable match OK!!")
} else {
    print("That doesn't match!!")
}

if MyType.self is Doable.Type {
    print("Doable match OK!!")
} else {
    print("That doesn't match!!")
}

我总是得到这样的结果:它不匹配

这是应该发生的事情吗?

或者我的测试或期望有误?

即使类型满足协议的要求,也必须明确说明其符合性。

Swift 类型仅在明确实现协议时才符合协议。

要将协议符合性添加到 - 例如 - 标准类型(如 String),您可以:

extension String: Doable {}
let aString = ""
if aString is Doable {
 print("it works")
}

Apple documentation on protocols

中查看有关其工作原理的更多详细信息

您还可以查看 条件一致性,这是一个 Swift 4 功能,可以满足您的需求。 Conditional conformance

:

在实际代码中这个测试是无用的,因为 Swift 编译器在那种情况下知道 String is 可行