为什么需要两次指定对象类型?

时间:2019-05-10 20:45:59

标签: swift generics protocols

提供此方法签名,该签名是协议的扩展:

loadObjectFromDB<T: DBObject>(_ db: ALBNoSQLDB, for key: String, queue: DispatchQueue? = nil, completion: @escaping (T) -> Void) -> DBCommandToken?

为什么我不能这样称呼它? (类别是遵守协议的结构)

let token = Category.loadObjectFromDB(db, for categoryKey) { (category) in
    // use category object
}

我收到一个编译错误,说无法推断出通用参数T,我必须在执行块中再次指定类型:

let token = Category.loadObjectFromDB(db, for categoryKey) { (category: Category) in
    // use category object
}

1 个答案:

答案 0 :(得分:1)

由于T的唯一约束是它是DBObject,因此编译器对此一无所知。如果将其限制为Self,则不必显式声明类型。