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

Vis*_*han 10 struct class ios swift

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

Dan*_*ire 8

在雨燕3.0,你可以调用 Mirror(reflecting:x).displayStyle其中x是你感兴趣的值.其结果将是class,struct,enum,dictionary,set...查看文档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
Run Code Online (Sandbox Code Playgroud)

当然,最好在实践中使用switch-case语句来处理.


Dan*_*all 6

在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"
Run Code Online (Sandbox Code Playgroud)

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


mus*_*afa 4

is运营商。

if someInstance is SomeType {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

并且有as?操作员。

if let someInstance = someInstance as? SomeType {
    // now someInstance is SomeType
}
Run Code Online (Sandbox Code Playgroud)