调用函数时无法推断通用参数“T”

Khu*_*ong 3 generics swift

我有一个功能:

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)