【问题标题】:Swift - Segmentation fault, conforming to a protocolSwift - 分段错误,符合协议
【发布时间】:2016-03-15 12:32:06
【问题描述】:

我有课

class Presenter<T: UIViewController where T: protocol<ViewInput, ViewController>>: NSObject
{
  override init()
  {
    super.init()

    Layer.sharedInstance.service.addListener(self)
  }
}

我希望Presenter 再符合一个Protocol 并写一个扩展:

extension Presenter: OneMoreProtocol
{
  func doSomething()
  {
    self.update()
  }
}

但这会引发一个错误:While emitting IR for source file ..../Presenter.swift (Segmentation fault)

协议外观:

@objc protocol OneMoreProtocol: AnyObject
{
  optional func doSomething()
}

因此,如果我删除扩展名,则上面描述的错误:addListener 在这种情况下会引发此错误: 参数类型“Presenter”不符合预期的类型“OneMoreProtocol”

我怎样才能以正确的方式符合要求?

【问题讨论】:

    标签: swift swift2


    【解决方案1】:

    现在我想我更好地理解了这个问题。您添加的新协议标有 @objc 属性。然后,您必须使用 @objc 标记扩展 Presenter 中的方法,如下所示:

    @objc func doSomething()
    

    但是你现在有一个更大的问题:“泛型类的扩展不支持@objc。”

    我不确定您最终要达到什么目的,但一个简单的技巧就是协议扩展。

    protocol OneMoreProtocol
    {
        func doSomething()
    }
    
    extension OneMoreProtocol {
        func doSomething() {}
    }
    

    现在您有了一个空的 doSomething 实现,因此您不必在任何采用协议的地方编写实现。

    【讨论】:

    • 好吧,我是 Swift 新手,我只支持已经创建的源,我不确定我们是否需要 AnyObject 以及这对我们有什么实际作用。
    • hm 同样的问题问题:由于信号而导致命令失败:分段错误:11
    • 似乎只有在类中实现协议方法而不是扩展的解决方案?
    • 如果你想要一个可选的方法,这就是我能想到的(用你展示的代码)。如果不希望协议中有可选方法,则在声明协议时无需使用@objc 属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多