Ios 如何在swift中检查对象是否属于类或结构
我被斯威夫特的问题难住了。假设我有一个对象,如何在swift中检查它是来自struct还是class。有Ios 如何在swift中检查对象是否属于类或结构,ios,swift,class,struct,Ios,Swift,Class,Struct,我被斯威夫特的问题难住了。假设我有一个对象,如何在swift中检查它是来自struct还是class。有is操作符 if someInstance is SomeType { // do something } 还有as?操作符 if let someInstance = someInstance as? SomeType { // now someInstance is SomeType } 您可以通过下面的给定方式和来完成此操作 下面是一个简单的例子: var nam
is
操作符
if someInstance is SomeType {
// do something
}
还有as?
操作符
if let someInstance = someInstance as? SomeType {
// now someInstance is SomeType
}
您可以通过下面的给定方式和来完成此操作
下面是一个简单的例子:
var name = "Big Hero"
if name.isKindOfClass(NSString){
println("this is this class")
}else{
println("this is not this class")
}
在Swift 3.0中,您可以调用
Mirror(反射:x)。displayStyle
其中x
是您感兴趣的值。结果将是类
,结构
,枚举
,字典
,集
。。。请参阅文档
代码示例:
struct SomeStruct {
var name: String
init(name: String) {
self.name = name
}
}
var astruct = SomeStruct(name:"myname")
Mirror(reflecting:astruct).displayStyle == .struct // will be true
Mirror(reflecting:astruct).displayStyle == .class; // will be false
class MyClass {
var name:String
init(name: String) {
self.name=name
}
}
var aclass = MyClass(name:"fsdfd")
Mirror(reflecting:aclass).displayStyle == .struct // will be false
Mirror(reflecting:aclass).displayStyle == .class // will be true
当然,在实践中最好使用switch case语句进行处理。这种方法在Swift 3中对我很有效:
class TestClass { }
struct TestStruct { }
var mystery:Any
mystery = TestClass()
// Is mystery instance a class type?
print(type(of:mystery) is AnyClass ? "YES" : "NO") // prints: "YES"
mystery = TestStruct()
// Is mystery instance a class type?
print(type(of:mystery) is AnyClass ? "YES" : "NO") // prints: "NO"
注意,这种方法只告诉您实例是否为类类型。事实上,它不是一个类并不一定意味着它是一个结构(可以是枚举、闭包、元组等),但对于大多数目的和上下文来说,这足以知道您是在处理引用类型还是值类型,这通常是需要的。在swift4中,检查类或结构
class TClass {}
struct TStruct {}
func who(_ any: Any) -> String {
if Mirror(reflecting: any).displayStyle == .class {
return "Class"
} else {
return "Struct"
}
}
print(who("Hello")) // Struct
print(who(TClass())) // Class
print(who(TStruct())) // Struct
print(who(1)) // Struct
看来这在Swift 3中是不可能做到的。然而,类对象有超类属性,而结构对象没有。只有当您知道它不是闭包时,因为它们也是引用类型。
class TClass {}
struct TStruct {}
func who(_ any: Any) -> String {
if Mirror(reflecting: any).displayStyle == .class {
return "Class"
} else {
return "Struct"
}
}
print(who("Hello")) // Struct
print(who(TClass())) // Class
print(who(TStruct())) // Struct
print(who(1)) // Struct