繁体   English   中英

调用无参数的泛型函数

[英]call generic function without params

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()    
    }
}

如何调用方法setNeedsUpdate()? 编译器错误“无法在不带参数的情况下调用'setNeedsUpdate'”

找到了一些决策,但是决策需要额外的参数

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>(){

您可以这样声明一个泛型函数,但由于无法提供指定泛型占位符的方式,因此永远无法调用它。 换句话说,这里没有什么可以告诉编译器Bar实际上是什么类型。 因此,就目前而言,这是一个无用的功能。

我认为首先要问自己的可能是为什么这根本需要是通用的-以及为什么确实需要类DataSource是通用的。 如果您知道ctrls将是由IDataSources组成的哈希表,那么很难看到泛型的用途。 目前尚不清楚您要完成的目标,但似乎您可能想得太多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM