2015-11-15 3 views
0

У меня есть функция, которая принимает параметр vcType: UIViewController.Type и я пытаюсь сделать чекДинамический тип проверки спутанность Swift

if getTopmostViewController() is vcType { 
    // do stuff 
} 

Но я ошибка «vcType не является типом» , Я не уверен, в чем проблема, или есть лучший способ сделать это.

+1

Похоже, что ваш параметр 'vcType' на самом деле не является типом. Это объект. Вы хотите проверить, имеет ли верхний контроллер представления тот же класс, что и объект 'vcType'? Или вы действительно хотите, чтобы ваша функция принимала параметр типа? –

ответ

2

Может быть, вы хотите что-то вроде этого:

if getTopmostViewController().isKindOfClass(vcType.dynamicType) { 
    // do stuff 
} 

выше, vcType является экземпляром некоторого класса, и это проверка getTopmostViewController() возвращает ли экземпляр одного и того же класса (или подкласса).

Или, может быть, вы действительно хотите, чтобы написать такую ​​функцию:

func doStuffIfTopMostViewControllerHasType<VCType: UIViewController>(_: VCType.Type) { 
    if getTopmostViewController() is VCType { 
     // do stuff 
    } 
} 

Что вы тогда назвать так:

doStuffIfTopMostViewControllerHasType(MyViewController.self) 

Обратите внимание, что я передаю сам по себе MyViewController класс, не экземпляр MyViewController.

+0

AFAIU, в случае OP, он будет просто проверять 'if getTopmostViewController(). IsKindOfClass (vcType) {...}', поскольку vcType уже является мета-типом. – courteouselk

+1

Кто-нибудь, кроме меня, считает, что странно, что единственный способ получить функциональность 'isKindOfClass' - через Фонд? Для Свифта было бы неразумно иметь это изначально. – matt

3

Try замена:

getTopmostViewController() is vcType 

С:

getTopmostViewController().dynamicType == vcType 

EDIT: Это будет работать только, чтобы проверить точный тип. Если контроллер, возвращаемый getTopmostViewController(), является потомком vcType, тогда возвращается false.

+1

Да, это сработает, если нужно только проверить, является ли самый верхний VC _exactly_ 'vcType'. Однако это не сработает, если необходимо проверить, является ли самый верхний VC «vcType» _or_ одним из его потомков. – courteouselk

+0

Правильно, отредактировал ответ. – Eppilo

Смежные вопросы