Проверка типов с использованием обобщенных и необработанных типов? - PullRequest
0 голосов
/ 25 мая 2019

У меня есть класс

class SomeViewController<T: SomeViewModel>: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { ... }

И еще один класс:

class AnotherViewController: UIViewController {
    private weak var someVC: UIViewController?
    ...
    func someFunc() {
        if someVC is SomeViewController { ... } // attempt 1
        // or
        if let vc = someVC as? SomeViewController { ... } // attempt 1
        ...
    }
    ...
}

Мне нужно посмотреть, является ли someVC значением SomeViewController, чтобы я мог получить доступ к переменной экземпляраэто не имеет ничего общего с универсальным типом.Однако при выполнении проверки через attempt 1 или attempt 2 проверка всегда завершается неудачей, и мой внутренний код никогда не выполняется.Как узнать, относится ли он к типу, но не к конкретному универсальному типу, например, мне не нужно указывать тип SomeViewModel?

РЕДАКТИРОВАТЬ: для ясности добавлен дополнительный код.

Ответы [ 2 ]

2 голосов
/ 25 мая 2019

Это не работает, потому что Свифт хочет знать тип универсального.Если вы просто хотите получить доступ к свойству, не имея отношения к универсальному, вы можете извлечь его в протокол.

protocol SomethingThatHasFoo {
  var foo: String { get }
}

class SomeViewController<T>: UIViewController, SomethingThatHasFoo {
  let foo = "foo"
}

class AnotherViewController {
  private weak var someVC: UIViewController?

  func someFunc() {
    if let vc = someVC as? SomethingThatHasFoo {
      print(vc.foo)
    }
  }
}
1 голос
/ 25 мая 2019

Вот пример, который работает:

class SomeViewModel{}

class A: SomeViewModel{}

class SomeViewController<T: SomeViewModel> : UIViewController{}

class AnotherViewController {

  private weak var someVC: UIViewController?

  init(vc: SomeViewController<A>) {
      someVC = vc
  }

  func someFunc() {
      if someVC is SomeViewController<A> {
          print("\(String(describing: someVC))")
      }
      if let vc = someVC as? SomeViewController<A> {
          print("\(vc)")
      }
}

Затем вы должны инициализировать его так:

    let someVC = SomeViewController<A>()
    let anotherVC = AnotherViewController.init(vc: someVC)
    anotherVC.someFunc()

Надеюсь, что ответил на ваш вопрос

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