Проверка метатипа, полученного в качестве аргумента

#swift #function

#быстрый #функция

Вопрос:

Классы Vc1 и Vc2 являются подклассами UIViewController:

 class Vc1: UIViewController { .... }
class Vc2: UIViewController { .... }
 

Следующая функция проверяет тип отправителя, полученный в качестве аргумента:

 func onVCComplete(senderType: UIViewController.Type, details: Any) {

    switch senderType {
        case Vc1.self: ...            
        case Vc2.self: ...
        default: break
    }
}
 

что приводит к ошибке компиляции: Expression pattern of type 'Vc1.Type' cannot match values of type 'UIViewController.Type' .

Попробовал Any.Type вместо UIController.Type — та же ошибка.

Каков правильный синтаксис?

Комментарии:

1. Это просто другой тип, поэтому вы получаете ошибку. Вы можете отправить UIViewController в свою функцию и проверить, успешно ли приведение его к определенному подклассу.

2. Кажется странным, но если вы используете if senderType == Vc1.self {} , он не выдает ошибку

Ответ №1:

Я предполагаю, что, возможно, ваше намерение состоит в том, чтобы создать экземпляр vc, проверить его фактический тип и выполнить над ним дополнительную работу … Если да, то почему бы просто не создать объект, а затем проверить его тип?

 import UIKit

class Vc1: UIViewController {}

class Vc2: UIViewController {}

func onVCComplete<T: UIViewController>(senderType: T.Type, details: Any) {

    let vc = senderType.init()

    switch vc {
    case is Vc1:
        print("do something with Vc1")
    case is Vc2:
        print("do something with Vc2")
    default:
        print("some other vcs")
    }
}

onVCComplete(senderType: Vc1.self, details: "Whatever")

 

Надеюсь, это поможет.

Комментарии:

1. Я думаю, что инициализация ViewController только для проверки его типа не подходит.

2. Но суть в проверке через метатип, а не через инициализацию

Ответ №2:

Проверьте приведенный ниже пример для проверки. Это может вам помочь.

 class A {

}

class B : A {

}

class C : A {

}

func onVCComplete(senderType: A, details: Any) {

    if senderType is B {
        print("B")
    }
    if senderType is C {
         print("C")
    }
}

onVCComplete(senderType: C(), details: "A")

 

Он выведет «C»