(空)协议符合测试
(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 可行
这里有一点让我有点困惑。
我已经为测试目的定义了这个空协议:
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 可行