我有两个这样的代表:
protocol MyFirstDelegate {
func change(value: int)
}
protocol MySecondDelegate {
weak var delegate: MyFirstDelegate?
}
这些协议在两个自定义的UIViewControllers中实现:
class MyFirstViewController: UIViewController, MyFirstDelegate {
...
}
class MySecondViewController: UIViewController, MySecondDelegate {
...
}
第一个UI视图控制器将使用segue推送第二个UI视图控制器。
在我的第一个UI视图控制器类中,我有以下代码来准备segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if let vc = (segue.destinationViewController) as? MySecondViewController {
vc.delegate = self
}
}
以上代码编译没有任何问题。但是,我认为第一个UI控制器具有下一个视图控制器类的知识。我更喜欢像这样传递委托:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if var vc = (segue.destinationViewController) as? MySecondDelegate {
vc.delegate = self
}
}
我收到了编译错误:
Cannot assign to property: "vc" is immutable.
似乎对于具体的UI视图控制器是可以的,但不是协议。对此有何解释和解决方案?
顺便说一下,在Objective-C中,可以这样做:
id<NSObject, MySecondDelegate> vc = segue.destinationViewController;
vc.delegate = self;
我无法在swift中找到一种方法来定义像
这样的变量let vc: AnyObject<type>? // like id<type>
更新
作为@David_Berry解决方案,如果我将协议标记为类,它就有效。以上代码实际上是简化的。我正在将我的ObjC代码转换为Swift。因此,我必须将协议标记为objc:
@objc protocol MyFirstDelegate : class {
func change(value: int)
}
@objc protocol MySecondDelegate {
weak var delegate: MyFirstDelegate?
}
使用@objc,我仍然得到相同的编译错误。
答案 0 :(得分:1)
好吧,我终于设法让你的例子进行编译,你有很多不一致的地方。我认为,实际问题的关键是要求协议是类协议:
protocol XXX : class { }
表示只能声明类的类型才能实现XXX。
但是,我真的不确定这是你的问题,需要进行许多其他更改(你至少用两种方式拼写MySecondDelegate,MySecondViewController至少有两种方式等等。
编译示例是:
// This protocol has to be class so that delegate can be weak
protocol MyFirstDelegate : class {
func change(value: Int)
}
protocol MySecondDelegate {
weak var delegate: MyFirstDelegate? { get set }
}
class MyFirstViewController: UIViewController, MyFirstDelegate {
func change(value: Int) {
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if var vc = (segue.destinationViewController) as? MySecondDelegate {
vc.delegate = self
}
}
}
class MySecondViewController: UIViewController, MySecondDelegate {
weak var delegate : MyFirstDelegate?
}
至于你的问题,目标-c语法id<Protocol>
或Class<Protocol>
没有快速的同义词。该问题有多个重复,提供了替代方案。