我有兩個代表這樣的:在Swift中相當於id <type>?
protocol MyFirstDelegate {
func change(value: int)
}
protocol MySecondDelegate {
weak var delegate: MyFirstDelegate?
}
那些協議在兩個定製UIViewControllers實施:
class MyFirstViewController: UIViewController, MyFirstDelegate {
...
}
class MySecondViewController: UIViewController, MySecondDelegate {
...
}
第一UI視圖控制器將通過使用一個賽格瑞推第二UI視圖控制器。
在我的第一UI視圖控制器類我有以下代碼以製備賽格瑞:
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;
我不能迅速找到一個方法來定義諸如
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,我仍然得到同樣的錯誤編譯。
是MySecondDelegate的Obj- C協議?在Swift中,你需要指定'get'和/或'set'。你的代碼不能編譯。請提供[mcve]。 – jtbandes