2015-02-13 4 views
2

В Objective-C вы можете указать как имя класса, так и набор протоколов в возвращаемом значении. Например, UIViewController, который является UIScrollViewDelegate:Swift: тип класса, который реализует протокол

- (UIViewController<UIScrollViewDelegate> *) viewDelegate; 

Я не могу найти способ, чтобы выразить это в Swift. Что-то вроде этого не удается, поскольку UIViewController не является протоколом:

func viewDelegate() -> protocol<UIViewController, UIScrollViewDelegate>; 
+0

Просто интересно, почему вам требуется объявление протокола по типу возврата? – Woodstock

+0

@Woodstock возвращаемое значение должно реализовывать методы как класса, так и протокола. Было бы неплохо, если бы проверяющий тип применял это вместо проверки во время выполнения. – kvance

ответ

1

Вы можете сделать обобщенную функцию с ограничением. Соответствует ли это вашему прецеденту?

func viewDelegate<T: UIViewController, UIScrollLViewDelegate>() -> T { 

    var t = T() 

    return t; 

    } 
+0

Это выглядит хорошо! Но я должен был упомянуть, что этот проект по-прежнему в основном Objective-C, и похоже, что общие функции не обратно совместимы. Я получаю ошибку компилятора. Метод не может быть помечен как @objc, потому что его тип результата не может быть представлен в Objective-C' так как это '@ objc'. – kvance

+1

Маркировка как решение, так как я не думаю, что есть способ сделать это, совместимый с ObjC. – kvance

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