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

Why do I need to specify the object type twice?

给这个方法签名,它是协议的扩展:

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

为什么我不能这样称呼它? (Category是一个遵守协议的结构体)

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
}

因为 T 的唯一限制是它是一个 DBObject,编译器对它一无所知。如果它被限制为 Self,那么您就不必明确声明类型。