当我有一个符合协议的类的可选值时,类型检查无法按预期进行。例如:
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。
在这种情况下还有另一种检查类型的方法吗?
答案 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
}