我有一个功能:
static func create<T>(userId: Int, streamId: Int, isPushStream: Bool = false, delegateToController controller: T? = nil) -> ShowUserInfoVC where T: UIViewController, T: ShowUserInfoVCDelegate {
let showUserInfoVC = ShowUserInfoVC()
showUserInfoVC.modalTransitionStyle = .crossDissolve
showUserInfoVC.modalPresentationStyle = .overCurrentContext
showUserInfoVC.delegate = controller
showUserInfoVC.userId = userId
showUserInfoVC.streamId = streamId
showUserInfoVC.isPushStream = isPushStream
return showUserInfoVC
}
Run Code Online (Sandbox Code Playgroud)
当我打电话时:
let vc = ShowUserInfoVC.create(userId: id, streamId: id)
Run Code Online (Sandbox Code Playgroud)
它说错误:
无法推断通用参数“T”
Swe*_*per 11
当你调用一个函数时,swift 编译器必须能够推断出每个泛型参数。
如果传递nil,则无法推断出泛型参数,因为它与每个可选类型兼容。
你必须告诉它这nil是某种类型的。你可以通过投射来做到这一点:
let vc = ShowUserInfoVC.create(userId: id, streamId: id, delegateToController: nil as SomeType?)
Run Code Online (Sandbox Code Playgroud)
正如亚历山大在评论中所建议的那样,SomeType?.none也可以Optional<SomeType>.none工作
其中SomeType是满足约束的类型。
这很糟糕,不是吗?
一种解决方法是创建一个create只需要 3 个参数的重载,并具有create如上所示的调用。
例如:
static func create<T>(userId: Int, streamId: Int, isPushStream: Bool = false) -> ShowUserInfoVC where T: UIViewController, T: ShowUserInfoVCDelegate {
create(userId: userId, streamId: streamId, isPushStream: isPushStream, delegateToController: nil as DummyController?)
}
// private/fileprivate "dummy" class
private class DummyController: UIViewController, ShowUserInfoVCDelegate {
// implement methods with stubs
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |