【发布时间】:2014-06-08 21:27:13
【问题描述】:
我定义了一个协议:
protocol Usable {
func use()
}
以及符合该协议的类
class Thing: Usable {
func use () {
println ("you use the thing")
}
}
我想以编程方式测试 Thing 类是否符合 Usable 协议。
let thing = Thing()
// Check whether or not a class is useable
if let usableThing = thing as Usable { // error here
usableThing.use()
}
else {
println("can't use that")
}
但我得到了错误
Bound value in a conditional binding must be of Optional Type
如果我尝试
let thing:Thing? = Thing()
我得到了错误
Cannot downcast from 'Thing?' to non-@objc protocol type 'Usable'
然后我将@objc 添加到协议并得到错误
Forced downcast in conditional binding produces non-optional type 'Usable'
此时我在as之后添加?,最终修复了错误。
如何通过非@objc 协议的条件绑定来实现此功能,就像在“Advanced Swift”2014 WWDC 视频中一样?
【问题讨论】:
-
我确定这是一个人为的案例,但它没有任何意义。编译器已经明确知道该事物遵守 Usable 协议。没有必要对其进行测试,因为测试永远不会失败。
-
@drewag 如果我有一堆类,有些符合,有些不符合。然后我可能希望能够检查每个类是否符合。无论如何,这只是一个错误的演示,很明显 Thing 类符合。
-
是的,如果您使用 AnyObject 作为事物的类型,我找不到检查它是否实现 Usable 的方法(这就是我没有提供答案的原因)。如果东西是 AnyObject 而 Usable 不是 objc 协议,则下面的答案都无法编译
标签: protocols swift conditional-binding