如何在swift中检查对象属于类或结构体

时间:2015-08-06 07:22:48

标签: ios swift class struct

我很快陷入了这个问题。假设我有一个对象,如何在swift中检查它是来自struct还是类。

6 个答案:

答案 0 :(得分:5)

在Swift 3.0中,您可以致电Mirror(reflecting:x).displayStyle,其中x是您感兴趣的价值。结果将是classstructenumdictionaryset ...请参阅文档https://developer.apple.com/reference/swift/mirror.displaystyle

代码示例:

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语句进行处理。

答案 1 :(得分:4)

这种方法在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"

请注意,此方法仅告知您实例是否为类类型。它不是类的事实并不一定意味着它是一个结构(可能是枚举,闭包,元组等)但是对于大多数目的和上下文而言这足以知道您是在处理引用类型还是值类型,这通常是需要的。

答案 2 :(得分:3)

is运营商。

if someInstance is SomeType {
    // do something
}

还有as?运算符。

if let someInstance = someInstance as? SomeType {
    // now someInstance is SomeType
}

答案 3 :(得分:2)

在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

答案 4 :(得分:-1)

您可以通过以下方式执行此操作并for more information on this please follow this link

class Shape {
    class func className() -> String {
        return "Shape"
    }
}

class Square: Shape {
    override class func className() -> String {
        return "Square"
    }
}

class Circle: Shape {
    override class func className() -> String {
        return "Circle"
    }
}

func getShape() -> Shape {
    return Square() // hardcoded for example
}

let newShape: Shape = getShape()
newShape is Square // true
newShape is Circle // false
newShape.dynamicType.className() // "Square"
newShape.dynamicType.className() == Square.className()

答案 5 :(得分:-1)

一个简单的例子:

{{1}}