所以这个想法是:
我有一个名为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
有没有办法实现它?或者编译器永远不会允许我创建一个类而不显式指定泛型变量的类型?