【问题标题】:Xcode 9.2 Command failed due to signal: Segmentation Fault: 11Xcode 9.2 命令因信号而失败:分段错误:11
【发布时间】:2018-01-21 21:30:07
【问题描述】:

尽管使用了所有泛型(未显示),但程序在没有警告的情况下编译并按预期运行。 但是,当我尝试通过从协议中删除 notUsed 方法来清理它时,我在主题中得到编译器错误,并且与类似的问题不同,在长堆栈转储中没有引用任何类或方法编译器。另外,在编辑器上方,消息:

发生内部错误。源代码编辑器功能受限。正在尝试恢复....” 立即出现。

它是简化的,因此是假设的,所以请不要问我通过在解析函数中转换为类型 T 来达到什么目的。 这是整个 osx 命令行程序,它运行得非常好,如图所示。不应该吗?如果您有建议,请您也提供代码,因为泛型语法对我来说有点棘手。

public class Future<T> {
    init(_ v:T) { value = v }
    let value: T
}
protocol DataParserType {
    associatedtype ResultType
    func notUsed(with data:Data) -> ResultType
    func parse<ResultType>(with data:Data) -> Future<ResultType>
}
class JSONParser: DataParserType {
    func notUsed(with data:Data) -> Future<Any> { return Future(2.0) }
    func parse<T>(with data:Data) -> Future<T> { return Future(45 as! T) }
}

let X: Future<Int> = JSONParser().parse(with: Data())
print(X.value)

【问题讨论】:

  • notUsed 不是该协议中的可选功能。它是否在某处的扩展中实现?此外,通常可以通过显式声明类型来修复奇妙的“分段错误 11”。

标签: swift xcode


【解决方案1】:

假设您的示例中的 parse 应该在 JSONParser 类中,我设法重现了您的问题。

为了满足协议的泛型函数,协议还必须将其声明为泛型。然而,仅仅将&lt;T&gt; 放在声明中并不能解决问题,因为它需要在函数签名的某个地方使用。关联的类型对此无济于事。

您的选择是:

  1. 将协议中的parse 函数签名更改为通用,并在参数中的某处使用T

  2. 不要使用泛型函数。

总有一天苹果会知道编译错误和分段错误之间的区别,但今天不是那一天。

【讨论】:

    【解决方案2】:

    我还没有弄清楚它为什么会这样工作,但它应该是这样的; Generic 参数需要是类签名的一部分,而不是函数签名。

    class JSONParser<FutureValue>: DataParserType {
          typealias ResultType = FutureValue
          func parse(with data:Data) -> Future<FutureValue> { return Future(45 as! FutureValue) }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多