2017-06-13 15 views
1

質問の指定方法がわかりません。このオブジェクト(MyClass)はViewControllerViewControllerにジェネリックを持つオプションオブジェクト

final class MyViewController: UIViewController { 
    //Should be optional, because I will assing myObject in prepareForSegue 
    //And I will initialize MyClass with different Objects, 
    //that implement MyProtocol 
    var myObject: MyClass? 
} 

の内側になります

final class MyClass<T: MyProtocol>: NSObject { 
    init(something: Something<[T]>) { ... } 
} 

しかし、私はMyClassジェネリック型を指定しなければなりませんが、私は初期化時に知ることができません。だから、ここでの例です。 私の質問はライフサイクルの後半で指定されるジェネリックのオプショナルオブジェクトを持つことが可能なのでしょうか?

EDIT。 initで汎用タイプを指定せずに、私が望むものを達成することは不可能だと思います。

+0

わかりましたかわかりません。これはあなたのために働くでしょう: 'var myObject:MyProtocol?'? – shallowThought

+0

いいえ、これは動作しません.Xcodeは、MyClassがジェネリック型を指定していないと訴えています。私がジェネリック型を知っていれば 'var myObject:MyClass ?'と書くことができます。ここで 'SomeGenericType'は' MyProtocol'を実装しています。 私の問題は、私はVC initでジェネリック型を知らないということです。私はそれがsegue経由で渡された後にしかわかりません。 – Xernox

+0

私はあなたが実際にジェネリックタイプを必要としないと思うが、多分それは間違っているかもしれない。 – shallowThought

答えて

0

私はクラスとプロトコルの両方の変数が必要だと思います。これは、現在の構文でスウィフト4でのみ可能です:

let myObject: MyClass & MyProtocol 

回避策は、NSObjectのを使用することができた(あなたのクラスはNSObjectのを継承するので)あなたがクラス特性/機能が必要な場合はその後、あなたはそれをキャストバックすることができますあなたのクラスに:

var myObject: NSObject? 
(myObject as? MyClass<YourGenericT>).someFunctionDeclaredInMyClass() 
+0

実際、私はinitに 'MyClass'オブジェクトの汎用タイプを指定したくありません。この理論的な例では、Segueを介して 'MyViewController'をプッシュし、' prepareForSegue'に 'myObject'を指定しますが、' MyProtocol'を実装していても 'T'が異なる場合は' myObject'を押します。私はそれをより明確に説明する方法がわかりません。とにかく、私はそれが不可能だと考え始めている。 – Xernox

+0

オプション 'MyProtocol'として' myObject'を定義することができます。しかし、なぜあなたは何かになる可能性のあるオブジェクトを望んでいますか?彼らが共通する唯一のものは 'MyProtocol'なので、変数をMyProtocolとして定義する必要があります。 –

関連する問題