【问题标题】:Generic parameter 'T' could not be inferred when calling function调用函数时无法推断通用参数“T”
【发布时间】:2017-07-20 11:50:19
【问题描述】:

我有一个功能:

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
}

当我打电话时:

let vc = ShowUserInfoVC.create(userId: id, streamId: id)

它说错误:

无法推断通用参数“T”

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    当你调用一个函数时,swift编译器必须能够推断出每个泛型参数。

    如果传递nil,则无法推断泛型参数,因为它与每个可选类型都兼容。

    你必须告诉它这个nil 属于某种类型。您可以通过投射来做到这一点:

    let vc = ShowUserInfoVC.create(userId: id, streamId: id, delegateToController: nil as SomeType?)
    

    正如 cmets 中的 Alexander 所建议的那样,SomeType?.noneOptional&lt;SomeType&gt;.none 也可以正常工作

    其中SomeType 是满足约束的类型。

    这很糟糕,不是吗?

    解决方法是创建一个只接受 3 个参数的 create 的重载,然后调用 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
    }
    

    【讨论】:

    • Optional&lt;SomeType&gt;.none 有效,而且(令我惊讶的是)SomeType?.none
    • @Alexander 已编辑。谢谢。
    • 如果我想委托一些ViewController,比如AViewController,BViewController....你的方法不好。
    • @Khuong 我看到你试图不将参数传递给最后一个参数,不是吗?这将使用您指定的 nil 默认值。对吗?
    • 是的,一些 ViewController 调用该静态函数不需要委托。
    猜你喜欢
    • 2020-04-20
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多