使用委托';当委托是Swift中的UIViewController时,s方法

使用委托';当委托是Swift中的UIViewController时,s方法,swift,delegation,Swift,Delegation,我不确定这是否是一个Xcode 6 Swift特定的问题,但问题来了 我有两个类,MyViewController和UtilViewController。UtilViewController具有UIViewController类型的委托属性,因为UtilViewController被设计为供我的应用程序的所有ViewController使用。它还有一个函数createOrder(),只有MyViewController才会调用该函数。因为这个函数只会被MyViewController调用,所以在

我不确定这是否是一个Xcode 6 Swift特定的问题,但问题来了

我有两个类,MyViewController和UtilViewController。UtilViewController具有UIViewController类型的委托属性,因为UtilViewController被设计为供我的应用程序的所有ViewController使用。它还有一个函数createOrder(),只有MyViewController才会调用该函数。因为这个函数只会被MyViewController调用,所以在createOrder()中有一行调用MyViewController声明的函数,如下所示

self.delegate!.methodInMyViewController()
但是,这会在UtilViewController中引发错误

'UIViewController' does not have a member named 'methodInMyViewController'

如何保持UIViewController委托的模块性,同时还能从属于UIViewController子类的我自己的ViewController调用方法?

您可以将委托转换为MyViewController,告诉编译器它实际上是MyViewController,并可以调用该方法

(self.delegate! as MyViewController).methodInMyViewController()
由于委托可能并不总是MyViewController,您可能希望在强制转换之前检查它是否为:

if self.delegate! is MyViewController{
    (self.delegate! as MyViewController).methodInMyViewController()
} 
使用
createOrder()
方法可以采用闭包(回调)参数。例如:

func createOrder(callWhenDone:()->()) {
    // do stuff ...
    callWhenDone()
}
MyViewController
中,您可以将该方法调用为

utilVC.createOrder {
    // called from createOrder()
    self.methodInMyViewController()
}

这是一个好问题。在Objective-C中,可以为属性指定类和协议:
@property(非原子、弱)UIViewController*委托为什么不通过回调(闭包)调用
createOrder()
到MyViewController,而不是使用通用委托?@MartinR我该怎么做?强制转换是否始终保留原始UIViewController?我假设强制转换会生成一个新对象,这对事件循环非常不利。或者使用可选强制转换:
如果让mvc=self.delegate!作为?MyViewController{mvc.methodInMyViewController()}
它不会更改实际对象的任何内容。这只是告诉编译器它可以将对象视为MyViewController的一种方式