Objective c id的等价物是什么<;类型>;斯威夫特?

Objective c id的等价物是什么<;类型>;斯威夫特?,objective-c,swift,Objective C,Swift,我有两位这样的代表: protocol MyFirstDelegate { func change(value: int) } protocol MySecondDelegate { weak var delegate: MyFirstDelegate? } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if var vc = (segue.destinationVie

我有两位这样的代表:

protocol MyFirstDelegate {
  func change(value: int) 
}

protocol MySecondDelegate {
  weak var delegate: MyFirstDelegate?
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
  if var vc = (segue.destinationViewController) as? MySecondDelegate {
    vc.delegate = self
  }
}
id<NSObject, MySecondDelegate> vc = segue.destinationViewController;
vc.delegate = self;
这些协议在两个自定义UIViewController中实现:

class MyFirstViewController: UIViewController, MyFirstDelegate {
  ...
}

class MySecondViewController: UIViewController, MySecondDelegate {
  ...
}
第一个UI视图控制器将使用segue推送第二个UI视图控制器

在我的第一个UI view controller类中,我准备了以下代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
  if let vc = (segue.destinationViewController) as? MySecondViewController {
    vc.delegate = self
  }
}
以上代码编译没有任何问题。但是,我认为第一个UI控制器了解下一个视图控制器类。我更喜欢这样通过委托:

protocol MyFirstDelegate {
  func change(value: int) 
}

protocol MySecondDelegate {
  weak var delegate: MyFirstDelegate?
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
  if var vc = (segue.destinationViewController) as? MySecondDelegate {
    vc.delegate = self
  }
}
id<NSObject, MySecondDelegate> vc = segue.destinationViewController;
vc.delegate = self;
我得到一个编译错误:

Cannot assign to property: "vc" is immutable.
似乎对于一个具体的UI视图控制器来说是可以的,但对于一个协议来说不是。对此有何解释和解决办法

顺便说一下,在Objective-C中,可以这样做:

protocol MyFirstDelegate {
  func change(value: int) 
}

protocol MySecondDelegate {
  weak var delegate: MyFirstDelegate?
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
  if var vc = (segue.destinationViewController) as? MySecondDelegate {
    vc.delegate = self
  }
}
id<NSObject, MySecondDelegate> vc = segue.destinationViewController;
vc.delegate = self;

使用@objc,我仍然会得到相同的编译错误。

好吧,我终于设法编译了您的示例,您有很多不一致之处。我认为,解决实际问题的关键是要求协议是类协议:

protocol XXX : class { }
表示只能声明类的类型来实现XXX

但是,我真的不确定这是否是您的问题,需要做很多其他更改(您至少拼写了两种方式mysecondelegate,至少拼写了两种方式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?
}

至于你的问题,objective-C语法没有swift同义词
id
Class
,该问题有多个副本,可以提供替代方案。

MySecondElegate是Obj-C协议吗?在swift中,你需要指定
get
和/或
set
。你的代码没有编译。请提供一个.ThanKS为您的努力提供帮助。我试图简化我的代码。实际上,我正处于将Objc代码转换为SWIFT的过程中。在此过程中,我必须将我的协议标记为“Objc”。因此,我仍然得到相同的编译错误。