UIViewController子类的Swift协议

3
是否可以声明协议并定义可符合该协议的对象类型?
我有一组闭包,我想在项目中的不同子类UIViewController中配置它们。(它们都相关)。
我想要一个工厂函数,它创建正确类型的UIViewController子类,但将其作为协议类型返回。
这样我就可以配置各种闭包并将视图控制器推入导航控制器。
我可以选择...
返回UIViewController超类并将其推入导航堆栈,但无法正确设置闭包,因为编译器不知道它符合协议。
或者...
返回协议类型,然后可以正确设置闭包,但是编译器不知道它是UIViewController子类,所以无法将其推入导航控制器。
有没有办法两者兼顾?
谢谢

您可以在运行时确定一个对象是否符合协议。 - Nazmul Hasan
@NazmulHasan 啊,你的意思是将它们作为 UIViewController 返回,然后使用 if let... 来确定其是否符合协议吗? - Fogmeister
2个回答

2
在Objective C中,您可以像这样声明变量:
UIViewController <Protocol> *variable;

很遗憾,使用Swift是不可能实现这一点的。考虑到Swift是多么面向协议编程,这非常奇怪。

这很不方便,因为正如您发现的那样,编译器不能同时了解类和协议,因此您必须进行两次强制转换,必须在运行时检查对象是否属于允许的类,并且必须在代码中记录它,以防止人们发送错误类型的对象。


是的,那就是我在寻找的。可惜似乎我无法做到。我可以像Nazmul在问题中评论的那样做,但这样你可能会传递一个不符合协议的UIViewController或者一个不同类型的对象。无论哪种方式都必须进行防御性编码。不过还是感谢你的确认。 - Fogmeister

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{ }

啊,好的。我喜欢这个。IAmViewController协议纯粹是为了“标记”每个ViewController,以便编译器能够识别它。很好,明天回到工作岗位时我会看一下。谢谢。 - Fogmeister
是的,你说得对,这就是我在我的项目中所做的。 - Dasem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接