什么相当于Swift中的id <type>?

时间:2016-04-28 05:37:15

标签: objective-c swift

我有两个这样的代表:

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,我仍然得到相同的编译错误。

1 个答案:

答案 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>没有快速的同义词。该问题有多个重复,提供了替代方案。