2015-08-06 2 views
8

Я застрял в вопросе быстро. Предположим, у меня есть один объект, как проверить, является ли он из struct или класса в swift.Как проверить, что объект принадлежит классу или структуре в swift

+0

Похоже, что это невозможно сделать в Swift 3. Однако объект класса есть ** суперкласс ** свойство и Struct объекты не имеют. –

ответ

2

is Оператор.

if someInstance is SomeType { 
    // do something 
} 

И есть as? Оператор.

if let someInstance = someInstance as? SomeType { 
    // now someInstance is SomeType 
} 
-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() 
-1

Простой пример для этого:

var name = "Big Hero" 
     if name.isKindOfClass(NSString){ 

      println("this is this class") 

     }else{ 

      println("this is not this class") 
     } 
4

В 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 

Конечно, было бы лучше всего решать с помощью переключателя регистра заявление на практике ,

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" 

Обратите внимание, что этот подход говорит вам, только если экземпляр является типом класса или нет. Тот факт, что это не, не обязательно означает, что это структура (может быть перечисление, закрытие, кортеж и т. Д.). Но для большинства целей и контекстов этого достаточно знать, имеете ли вы дело с ссылочным типом или тип значения, который обычно является необходимым.

+0

Только если вы знаете, что это не закрытие, потому что они также являются ссылочными типами. – Binarian

1

В 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 
Смежные вопросы