[英]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.