2016-04-28 65 views
1

我有兩個代表這樣的:在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,我仍然得到同樣的錯誤編譯。

+0

是MySecondDelegate的Obj- C協議?在Swift中,你需要指定'get'和/或'set'。你的代碼不能編譯。請提供[mcve]。 – jtbandes

回答

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? 
} 

至於你的問題,沒有迅速同義詞Objective-C的語法id<Protocol>Class<Protocol>有多個複製到這個問題,提供替代品。

+0

感謝您的努力幫助。我試圖簡化我的代碼。其實,我正在將我的ObjC代碼轉換爲Swift。在這個過程中,我必須將我的協議標記爲@objc。結果,我仍然得到相同的編譯錯誤。 –