我很快陷入了这个问题。假设我有一个对象,如何在swift中检查它是来自struct还是类。
答案 0 :(得分:5)
在Swift 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
当然,最好在实践中使用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}}