Xcode 9.2命令因信号失败:分段故障:11

时间:2018-01-21 21:30:07

标签: swift xcode

尽管使用了所有的泛型(未显示),但程序编译时没有警告并按预期运行。 但是,当我尝试通过从协议中删除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)

2 个答案:

答案 0 :(得分:1)

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

对于满足协议的通用函数,协议还必须将其声明为通用。但是,将<T>放在声明中并不能解决问题,因为它需要在函数签名中的某处使用。相关类型对此没有帮助。

您的选择是:

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

  2. 不要使用通用功能。

  3. 有一天,Apple将学习编译错误和分段错误之间的区别,但今天不是那一天。

答案 1 :(得分:0)

我仍然没有弄清楚它为什么会这样运作,但这就是它的样子; Generic参数需要是类签名的一部分,而不是函数签名。

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