2017-06-13 32 views
1

不知道如何指定我的问题。所以这里有一个例子:在ViewController中使用泛型的可选对象

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

这个对象(MyClass)将里面ViewController

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

但我必须指定MyClass泛型类型,但在初始化我不知道。 所以我的问题是有可能有一个可选的对象与将在生命周期中稍后指定的泛型?

编辑。我认为不可能实现我想要的,而不需要在init中指定泛型类型。

+0

不知道我是否理解。这会为你工作:'var myObject:MyProtocol?'? – shallowThought

+0

不,这不起作用,Xcode抱怨MyClass没有指定它的泛型类型。如果我知道我的泛型类型,我可以写'var myObject:MyClass ?'SomeGenericType'实现'MyProtocol'。 我的问题是,我不知道在VC初始化的泛型类型,我知道它只是通过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',但是我可以推送'myObject',其中'T'不同,尽管实现了'MyProtocol'。我不知道如何解释清楚。无论如何,我开始认为这是不可能的。 – Xernox

+0

您可以将'myObject'定义为可选的'MyProtocol'。但为什么你想要一个可以是任何东西的物体?他们唯一的共同点就是'MyProtocol',所以你应该把你的变量定义为'MyProtocol' –

相关问题