代码之家  ›  专栏  ›  技术社区  ›  Twitter khuong291

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

  •  5
  • Twitter khuong291  · 技术社区  · 7 年前

    我有一个功能:

    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)
    

    上面写着错误:

    1 回复  |  直到 7 年前
        1
  •  13
  •   Sweeper    7 年前

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

    nil

    你必须告诉它 属于某种类型。您可以通过铸造:

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

    正如亚历山大在评论中所说, SomeType?.none Optional<SomeType>.none

    哪里 SomeType 是满足约束的类型。

    这太糟糕了,不是吗?

    create 这只需要3个参数,并且具有该调用 创造

    例如:

    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
    }