【问题标题】:inheritance from non-protocol type 'UIViewController' @objc protocol User: UIViewController从非协议类型“UIViewController”@objc 协议继承用户:UIViewController
【发布时间】:2021-05-27 21:32:19
【问题描述】:

当我们向协议声明可选属性时,需要用@objc 属性对其进行标记。

协议被限制为UIViewController类型的类。

@objc protocol User: UIViewController {
    @objc optional var userImage: UIImage {get set}
}

我收到以下错误。如何将协议限制为UIViewController 并具有可选属性?

error: inheritance from non-protocol type 'UIViewController'
@objc protocol User: UIViewController {

【问题讨论】:

  • 这里有些不对劲,User 怎么可能是视图控制器的子类?你的意思是UserController
  • 编译时会出现警告Redundant constraint 'Self' : 'AnyObject',当我们尝试通过实现的控制器访问时,会出现编译时错误Value of type <Implementing Controller>, has no member "userImage"

标签: ios swift swift-protocols


【解决方案1】:

将协议限制为某些类是 Swift 独有的功能,因此此处的 @objc 声明与该限制不兼容。

其次,您可能希望将您的属性声明为可选属性 (UIImage?),因为这将符合要求的可选性。

如果你想要 Swift 中的可选属性,那么你可以为它们添加默认实现

protocol User: UIViewController {
    var userImage: UIImage? { get set }
}

extension UIViewController {
    var userImage: UIImage? { 
        get { nil } 
        set { /* do nothing */ }
}

但是这会使你的类conformers non-objc,因此你将不能在Objective-C中使用它们。

【讨论】:

  • 关于仅适用于 Swift 的限制的好点,因此它不适用于 Objective-c。我更喜欢使用第二点,即将它声明为可选UIImage?
猜你喜欢
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多