#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»