Общий параметр 'T' не может быть выведен - проблемы с генериками - PullRequest
0 голосов
/ 24 октября 2018

У меня есть этот класс, называемый openApp, то есть предназначенный для открытия другого приложения с помощью URL-адреса перенаправления и набора для хранения.Я не слишком знаком с дженериками, и это заставляет меня столкнуться с этой ошибкой

Общий параметр 'T' не может быть выведен

Не обращаюсь ли я к использованию 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)
            }
        }
    }

1 Ответ

0 голосов
/ 24 октября 2018

Поскольку проблема возникает, когда вызывает метод openOrDownloadPlayPortal как:

openApp.openOrDownloadPlayPortal(delegate: self)

Вы столкнетесь с упомянутой ошибкой:

Общий параметр 'T 'не может быть выведено

, если ваш класс не соответствует SKStoreProductViewControllerDelegate.Например, предположим, что вы вызываете его в ViewController классе, как:

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

        openApp.openOrDownloadPlayPortal(delegate: self)
    }
}

Итак, вы должны убедиться, что ViewController имеет:

extension ViewController: SKStoreProductViewControllerDelegate {
    // ...
}

Причина ошибки: компилятор предполагает, что параметр T в методе openOrDownloadPlayPortal должен соответствовать SKStoreProductViewControllerDelegate, поэтому реализация

openApp.openOrDownloadPlayPortal(delegate: self)

означает, что он не будет распознан как соответствующий.введите T, если только вы не сделаете self (ViewController в приведенном выше примере) соответствующим SKStoreProductViewControllerDelegate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...