我想对给定协议的类型进行switch声明。可以说我有:
protocol A {}
struct SA: A {}
struct SB: A {}
let aself: A.Type = SA.self
let bself: A.Type = SB.self
switch aself {
case is SA:
break
default:
break
}
我能以某种方式使这种开关起作用吗?这给我警告,这种转换总是失败。可以通过某种方式做到吗?
答案 0 :(得分:5)
您可以这样写:
switch aself {
case is SA.Type:
print("is SA.Type")
default:
print("Unknown type")
}
或者这个:
switch ObjectIdentifier(aself) {
case ObjectIdentifier(SA.self):
print("is SA.Type")
default:
print("Unknown type")
}
(某些代码解释了子类的不同行为,如下所述)。
class CA: A {}
class CAA: CA {}
let caaself: A.Type = CAA.self
switch caaself {
case is CA.Type:
print("is CA.Type") //->is CA.Type
default:
print("Unknown type")
}
switch ObjectIdentifier(caaself) {
case ObjectIdentifier(CA.self):
print("is CA.Type")
default:
print("Unknown type") //->Unknown type
}
要在类型匹配中排除子类时,可能需要使用ObjectIdentifier
。 (也许还有其他方法,但我现在没有想到。)
答案 1 :(得分:2)
我假设您还将要使用强制类型转换值,在这种情况下,您可以使用一些模式匹配:
switch aself {
case let a as SA.Type:
break
default:
break
}
如果您不想使用强制转换的值:
switch aself {
case let _ as SA.Type:
break
default:
break
}