2016-11-21 7 views
0

私は次のコードをお持ちの場合:Swiftのプロトコルに準拠した特定のクラスを宣言できますか?

class MyClass { 
    ... 
} 

protocol MyProtocol { 
    ... 
} 

を、それがMyProtocolに準拠MyClassのクラスまたはサブクラスを受け入れる型を宣言することは可能ですか?

単純なアプローチは、(すなわち、第1のタイプを指定し、変数宣言で使用)動作

var thing: MyClass & MyProtocol = ... 
+0

[SwiftプロトコルのUIViewControllerサブクラスの可能な複製](http://stackoverflow.com/questions/39596262/swift-protocol-for-uiviewcontroller-subclasses) – EmilioPelaez

+0

残念なことに、この質問と回答を確認してください。 http://stackoverflow.com/questions/39596262/swift-protocol-for-uiviewcontroller-subclasses/39596523#comment66501660_39596523 – EmilioPelaez

+1

あなたの英語の文章は 'または'と言っていますが、あなたのコードは '&'(と)と書いています。どちらがいいですか? – Alexander

答えて

0

:擬似コードで

class MCImplementingMP: MyClass, MyProtocol { 
} 

var thing: MCImplementingMP = ... 
+0

いいえ、動作していません。 'thing'に' MyClass'のインスタンスであるものを代入したいのであれば、 'MyProtocol'に従いますが、' MCImplementingMP'のインスタンスではありませんか? –

+0

質問は、**なぜそれがそのような例ではないのでしょうか...学問的な運動以外の理由です。誰かが「My ...」タイプのコード・ベースを設計している場合、正しい一致を提供するタイプを使用することは難しくありません。 –

0

いいえ、それが可能Objective-Cで可能であったではありませんスウィフトで 私が知っているすべての解決策は、ハックのように見え、多くの実行時の型チェックが必要です。だから私は自分で出てきた - 状況に応じて必要なクラスやプロトコルのように振る舞うことができラッパー型を宣言:

class MyClass {} 
protocol MyProtocol: class {} 

class Wrapper { 
    var instance: AnyObject 
    init?(instance: MyClass) { 
     guard instance is MyProtocol else { return nil } 
     self.instance = instance 
    } 

    init?(instance: MyProtocol) { 
     guard instance is MyClass else { return nil } 
     self.instance = instance 
    } 

    var instanceAsMyClass: MyClass { 
     return instance as! MyClass 
    } 

    var instanceAsMyProtocol: MyProtocol { 
     return instance as! MyProtocol 
    } 
} 

あなたはプロパティ名を変更したいかもしれませんが、考え方は明らかです。

関連する問題