如何开启Type

时间:2018-09-10 16:14:18

标签: swift types switch-statement

我想对给定协议的类型进行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
}

我能以某种方式使这种开关起作用吗?这给我警告,这种转换总是失败。可以通过某种方式做到吗?

2 个答案:

答案 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
}