【问题标题】:Cannot convert return expression of type 'P?' to return type 'UIViewController'无法转换“P?”类型的返回表达式?返回类型“UIViewController”
【发布时间】: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

标签: ios swift


【解决方案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

  }

}

【讨论】:

    【解决方案2】:
    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
    
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      class A: UIViewController {
      
          let d: [P] = [P]()
      
          func m() -> UIViewController? {
              return self.d.first as? UIViewController
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多