在Swift中类型检查失败并带有可选值

时间:2019-05-20 17:32:26

标签: swift typechecking

当我有一个符合协议的类的可选值时,类型检查无法按预期进行。例如:

import Foundation

protocol MyProtocol { }

class MyClass: MyProtocol { }

let myClass: MyClass = MyClass()
let myClassType = type(of: myClass)

print("myClassType is MyClass.Type: \(myClassType is MyClass.Type)")
print("myClassType is MyProtocol.Type: \(myClassType is MyProtocol.Type)")

let myClassOpt: MyClass? = MyClass()
let myClassTypeOpt = type(of: myClassOpt)

print("myClassTypeOpt is MyClass?.Type: \(myClassTypeOpt is MyClass?.Type)")
print("myClassTypeOpt is MyProtocol?.Type: \(myClassTypeOpt is MyProtocol?.Type)")

输出:
myClassType是MyClass.Type:true
myClassType是MyProtocol.Type:true
myClassTypeOpt是MyClass?。类型:true
myClassTypeOpt是MyProtocol?。类型:false

上一次类型检查的期望值为true,但为false。
在这种情况下还有另一种检查类型的方法吗?

2 个答案:

答案 0 :(得分:0)

type(of: myClassOpt)的结果未创建该类型的变量。而是返回一个标识myClassOpt类型的字符串。由于您已将myClassOpt声明为类型MyClass?,因此结果是一个字符串,内容类似于Optional<MyClass>

是的,当您运行myClassTypeOpt is MyProtocol?.Type时,结果为False。

答案 1 :(得分:0)

您可以使用optional首先if-let unwrap值,然后检查其类型,而不是直接使用optional来检查其类型,即

let myClassOpt: MyClass? = MyClass()

if let myClassOpt = myClassOpt {
    let myClassTypeOpt = type(of: myClassOpt)
    print("myClassTypeOpt is MyClass.Type: \(myClassTypeOpt is MyClass.Type)") //true
    print("myClassTypeOpt is MyProtocol.Type: \(myClassTypeOpt is MyProtocol.Type)") //true
}