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 不带参数调用泛型函数 协议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()?
编译器错误“无法在没有参数的情况下调用'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>(){