繁体   English   中英

无法转换类型为“P”的返回表达式? 返回类型“UIViewController”

[英]Cannot convert return expression of type 'P?' to return type 'UIViewController'

我有一个只能应用于 UIViewController 类的协议

我有一组必须响应 P 协议的对象

所以当从数组中返回一个对象时,我确信得到了一个 UIViewController 类对象。

为什么编译器会返回错误:

无法将“P”类型的返回表达式转换为“UIViewController”类型的返回类型?

protocol P where Self: UIViewController {
    func f ()
}

class A: UIViewController {

    let d: [P] = [P]()

    func m() -> UIViewController? {

        return self.d.first

    }

}

更新

Swift 5.1 解决此代码没有错误

此时,编译器不知道[P]仅包含UIViewController实例。 这可能是 Swift 中的一个错误,因为当您尝试执行以下操作时,编译器会抱怨

struct B: P {
  func test() {}
}

'P' 要求 'B' 继承自 'UIViewController'

一个不错的解决方案是

class A: UIViewController {
  typealias PViewController = UIViewController & P
  let d: [PViewController] = [PViewController]()

  func m() -> UIViewController? {

      return self.d.first

  }

}
protocol P {
    var viewController: UIViewController { get }
}

extension P where Self: UIViewController {
    var viewController: UIViewController {
        return self
    }
}

class A: UIViewController {
    let d: [P] = [P]()

    func m() -> UIViewController? {

        return self.d.first?.viewController

    }
}

这可能会起作用,因为编译器不会将类型转换为Self

class A: UIViewController {

    let d: [P] = [P]()

    func m() -> UIViewController? {
        return self.d.first as? UIViewController
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM