Определить, является ли объект подклассом другого класса - PullRequest
0 голосов
/ 09 мая 2018

У меня есть экспериментальный код. Но конечной целью является findType (), которая должна напечатать / вернуть true, если объект имеет тип 'parent'

class Car {}
class RacingCar:Car {}
let raceCar = RacingCar()

func findType(_ obj: Any, parent: AnyClass) {
    print(type(of: obj)) // RacingCar
    print(parent) // Car
    print(type(of: obj) == parent) // false
//  if obj is parent {
//      print("true")
//  }
}

findType(raceCar, parent: Car.self)

Как это может быть достигнуто?


С предложением шаблона,

    func isTypeOf<T>(_ obj: Any, parent: T.Type) {
    if obj is T { // true
        print("true")
    }
}

isTypeOf(raceCar, parent: Car.self) // worked

func getType(parentClass: AnyClass){
    isTypeOf(raceCar, parent: parentClass)
}
getType(parentClass: Car.self) // this dont work.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Вы можете использовать дженерики для получения типа:

func findType<T>(_ obj: Any, parent: T.Type) {
    print(type(of: obj)) // RacingCar
    print(parent) // Car
    print(type(of: obj) == parent) // false
    if obj is T { // true
        print("true")
    }
}

findType(raceCar, parent: Car.self)

В качестве альтернативы, вы можете передать объект parent напрямую, тогда он будет выглядеть так:

func findType<T>(_ obj: Any, parent: T) {
    print(type(of: obj)) // RacingCar
    print(type(of: parent)) // Car
    print(type(of: obj) == T.self) // false
    if obj is T {
        print("true")
    }
}

let car = Car()
findType(raceCar, parent: car)
0 голосов
/ 09 мая 2018

Согласно документации Apple вы можете использовать type(of:)

Возвращает динамический тип значения.

Обсуждение

Вы можете использовать функцию type (of :), чтобы найти динамический тип значение, особенно когда динамический тип отличается от статического тип. Статический тип значения - это известный тип времени компиляции Значение. Динамический тип значения - это фактический тип значения в время выполнения, которое может быть вложено в его конкретный тип.

В следующем коде переменная count имеет ту же статическую и динамический тип: Int. Когда счет передается в функцию printInfo (_ :), однако параметр value имеет статический тип Any (тип для параметра) и динамический тип Int.

let type = type(of: value as Any)
print("'\(value)' of type '\(type)'")
0 голосов
/ 09 мая 2018

Почему бы тебе просто не поставить:

raceCar is Car

Это вернет истину.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...