Swift 不带参数调用泛型函数 协议IDataSource:AnyObject{ 类型别名DS; 类型别名U; func数据源(ds:ds,index:Int; func数据源(ds:ds,数据:[U]); } 类数据源{ VarMap=[NSManagedObjectID:T](); var数据=[T](); 变量ctrls:NSHashTable=NSHashTable.weakObjectsHashTable(); func find(值:T)->Int?; 选择的变量:T?; func setNeedsUpdate(){ 对于self.ctrls.allObjects中的ctrl{ 让client=ctrl为!Bar; 数据源(self,data:self.data); } } func foo(){ //错误 setNeedsUpdate() } }
如何调用方法setNeedsUpdate()?Swift 不带参数调用泛型函数 协议IDataSource:AnyObject{ 类型别名DS; 类型别名U; func数据源(ds:ds,index:Int; func数据源(ds:ds,数据:[U]); } 类数据源{ VarMap=[NSManagedObjectID:T](); var数据=[T](); 变量ctrls:NSHashTable=NSHashTable.weakObjectsHashTable(); func find(值:T)->Int?; 选择的变量:T?; func setNeedsUpdate(){ 对于self.ctrls.allObjects中的ctrl{ 让client=ctrl为!Bar; 数据源(self,data:self.data); } } func foo(){ //错误 setNeedsUpdate() } },swift,generics,protocols,Swift,Generics,Protocols,如何调用方法setNeedsUpdate()? 编译器错误“无法在没有参数的情况下调用'setNeedsUpdate'”已找到一些决策,但决策需要额外的参数 protocol IDataSource:AnyObject{ typealias DS; typealias U; func dataSource(ds:DS, index:Int?); func dataSource(ds:DS, data:[U]); } class DataSource<T:A
编译器错误“无法在没有参数的情况下调用'setNeedsUpdate'”已找到一些决策,但决策需要额外的参数
protocol IDataSource:AnyObject{
typealias DS;
typealias U;
func dataSource(ds:DS, index:Int?);
func dataSource(ds:DS, data:[U]);
}
class DataSource<T:AnyObject>{
var map = [NSManagedObjectID:T]();
var data = [T]();
var ctrls:NSHashTable = NSHashTable.weakObjectsHashTable();
func find(value:T)->Int?;
var selected:T?;
func setNeedsUpdate<Bar:IDataSource where Bar.U==T,Bar.DS==DSGen>(){
for ctrl in self.ctrls.allObjects {
let client = ctrl as! Bar;
client.dataSource(self, data:self.data);
}
}
func foo(){
// error
setNeedsUpdate()
}
}
func setNeedsUpdate(类型:Bar.type){
对于self.ctrls.allObjects中的ctrl{
让client=ctrl为!Bar;
数据源(self,data:self.data);
}
}
func foo(){
//错误
setNeedsUpdate(Bar.self)
}
func setNeedsUpdate(){
您可以像这样声明一个泛型函数,但在隔离状态下,您永远不能调用它,因为您没有提供指定泛型占位符的方法。换句话说,这里没有任何东西可以告诉编译器实际上是什么类型的Bar
。因此,就目前而言,这是一个无用的函数
我想首先要问你自己的可能是,为什么这需要是一个泛型——事实上,为什么类数据源需要是一个泛型。如果你知道
ctrls
将是一个由IDataSources组成的哈希表,很难看出泛型的用途。不清楚你想实现什么,但似乎你正在努力可能是想得太多了。var数据的通用:[T];好的,但这仍然不能解释为什么setNeedsUpdate
需要是泛型的,因为您已经知道哈希表中的内容。哈希表的元素类型是IDataSource,但当我编写时,让client=ctrl作为!IDataSource;
-错误协议“IDataSource”只能用作泛型约束,因为它具有Self或associ使用NSNotificationCenter代替NSHashTable的ated类型要求解决了此问题
func setNeedsUpdate<Bar:IDataSource where Bar.U==T,Bar.DS==DSGen>(type:Bar.Type){
for ctrl in self.ctrls.allObjects {
let client = ctrl as! Bar;
client.dataSource(self, data:self.data);
}
}
func foo<Bar:IDataSource where Bar.U==T,Bar.DS==DSGen>(){
// error
setNeedsUpdate(Bar.self)
}
func setNeedsUpdate<Bar:IDataSource where Bar.U==T,Bar.DS==DSGen>(){