UIViewController子类的Swift协议

时间:2016-09-20 14:03:12

标签: ios swift protocols

是否可以声明协议并定义可以符合它的对象类型?

我有一组闭包,我想在我的项目中的UIViewController的各种不同子类中配置。 (它们都是相关的)。

我想要一个工厂函数来创建正确类型的UIViewController子类,但然后将其作为协议类型返回。

这样我就可以配置各种闭包并将视图控制器推到导航控制器上。

我可以......

返回UIViewController超类并将其推送到导航堆栈,但由于编译器不知道它符合协议,因此无法正确设置闭包。

...或

返回协议类型,我可以正确设置闭包,但编译器不知道它是UIViewController子类,所以我不能把它推到导航控制器上。

有两种方法可以做到吗?

由于

2 个答案:

答案 0 :(得分:1)

在Objective C中你可以声明一个这样的变量:

UIViewController <Protocol> *variable;

不幸的是,对于Swift而言,这是不可能的,考虑到面向协议的Swift是如何,这很奇怪。

这非常不舒服,因为就像你发现的那样,编译器不能同时知道类和协议,所以你必须抛出两次,你必须检查对象是否允许在运行时类,并且必须在代码中记录它,以防止人们发送错误类型的对象。

答案 1 :(得分:1)

是的,你可以! 这样做..

// a protocol to make sure the the conforming object is subclass of UIViewController

public protocol IamViewController { }

//make every UIViewController  adopt the IamViewController protocol

extension UIViewController:IamViewController { }

//create your protocol and add a requirement that it must be UIViewController if it want to conform to it

protocol vcObject:IamViewController{ }