Ios 如何在swift中检查对象是否属于类或结构

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

我被斯威夫特的问题难住了。假设我有一个对象,如何在swift中检查它是来自struct还是class。

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