调用没有参数的泛型函数

时间:2015-06-13 09:37:41

标签: swift generics protocols

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'而没有参数”

2 个答案:

答案 0 :(得分:0)

找到了一些决定,但决定要求额外的参数

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

答案 1 :(得分:0)

func setNeedsUpdate<Bar:IDataSource where Bar.U==T,Bar.DS==DSGen>(){

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

我认为首先要问自己可能是为什么这需要一个通用的 - 为什么DataSource类需要是通用的。如果您知道ctrls将是由IDataSources组成的哈希表,则很难看出通用的用途。它不清楚你想要完成什么,但似乎你可能会过度思考它。