将通用对象作为类成员,而不使用协议或类指定类型

时间:2017-09-15 16:07:32

标签: swift generics swift3 protocols

所以这个想法是: 我有一个名为AmazingViewClass的子类(例如NSView),我想存储一个名为AmazingData的泛型类型的成员。

AmazingData定义为:

protocol AmazingDataType {}

class  AmazingData <x:CustomStringConvertible, y:Hashable>: AmazingDataType {
    var xValues: x
    var yValues: y
    init(xValues: x, yValues: y) {
        self.xValues = xValues
        self.yValues = yValues
    }
}

然后我有一个只能应用于NSView子类的协议:

protocol AmazingViewProtocol  {
    associatedtype View: NSView = Self //AmazingViewProtocol can only be applied to NSView
    associatedtype myType: AmazingDataType //so that data can only be of type AmazingDataType
    var data: myType! { get set }
}

最后我宣布了一个类 AmazingViewClass

class AmazingView: NSView, AmazingViewProtocol {

}

但是,它不允许我这样做,需要指定数据变量的类型,如下所示:

class AmazingView: NSView, AmazingViewProtocol {
    typealias myType = AmazingData <Int, Int>
    var data: AmazingData <Int, Int>!
}

我想避免的是将AmazingViewClass声明为AmazingViewClass <Type,Type>,并在初始化 AmazingView 之后将数据设置为我想要的任何类型:

let data = AmazingData<Int, Double>()
... 
var aView = AmazingView(frame: CGRect...)
aView.data = data

有没有办法实现它?或者编译器永远不会允许我创建一个类而不显式指定泛型变量的类型?

0 个答案:

没有答案