【发布时间】:2023-03-12 18:35:01
【问题描述】:
我有一个只能应用于 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 无错误地解析此代码
【问题讨论】:
-
从您的退货声明中删除 .first ,它会正常工作:)
-
UIViewController可能不符合P,所以它不起作用,改为返回P? -
@Tj3n 由于应用于 P 协议的约束,数组中的所有对象都是 UIViewController 类的对象。 P 协议只能应用于 UIViewController 类对象
-
你也可以像
return (self.d.first as? UIViewController)一样强制转换为UIViewController