无法推断通用参数 'T' - 泛型问题

Generic Paramter 'T' could not be inferred - Problems with generics

我有一个名为 openApp 的 class,意思是使用重定向 url 和存储工具包打开另一个应用程序。我不太熟悉泛型,它让我 运行 陷入这个错误

Generic Parameter 'T' could not be inferred

我没有正确处理 T 的使用吗?我真的不明白这是怎么回事。

public class openApp {
        static func openOrDownloadPlayPortal<T>(delegate: T) where T: SKStoreProductViewControllerDelegate, T:
            UIViewController {

            let storeProductVC = SKStoreProductViewController()
            let playPortalURL = URL(string: "redirect url")!


            if UIApplication.shared.canOpenURL(playPortalURL) {
                UIApplication.shared.openURL(playPortalURL)
            }
            else {
                let vc = SKStoreProductViewController()
                let params = [
                    SKStoreProductParameterITunesItemIdentifier: "app identifier"
                ]
                vc.loadProduct(withParameters: params) { success, err in
                    if let err = err {

                    }
                }
                vc.delegate = delegate
                delegate.present(vc, animated: true, completion: nil)
            }
        }
    }

由于问题出现在调用 openOrDownloadPlayPortal 方法时:

openApp.openOrDownloadPlayPortal(delegate: self)

您将遇到上述错误:

Generic parameter 'T' could not be inferred

如果您的 class 符合 SKStoreProductViewControllerDelegate。例如,假设您在 ViewController class 中调用它,如:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        openApp.openOrDownloadPlayPortal(delegate: self)
    }
}

因此,您必须确保 ViewController 具有:

extension ViewController: SKStoreProductViewControllerDelegate {
    // ...
}

错误的原因是:编译器假定openOrDownloadPlayPortal方法中的T参数必须符合SKStoreProductViewControllerDelegate,因此实现

openApp.openOrDownloadPlayPortal(delegate: self)

意味着它不会被识别为适合 T 的类型,除非你使 self(上例中的 ViewController)符合 [=15] =].