是否可以声明协议并定义可以符合它的对象类型?
我有一组闭包,我想在我的项目中的UIViewController
的各种不同子类中配置。 (它们都是相关的)。
我想要一个工厂函数来创建正确类型的UIViewController
子类,但然后将其作为协议类型返回。
这样我就可以配置各种闭包并将视图控制器推到导航控制器上。
我可以......
返回UIViewController
超类并将其推送到导航堆栈,但由于编译器不知道它符合协议,因此无法正确设置闭包。
...或
返回协议类型,我可以正确设置闭包,但编译器不知道它是UIViewController
子类,所以我不能把它推到导航控制器上。
有两种方法可以做到吗?
由于
答案 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{ }