尽管使用了所有的泛型(未显示),但程序编译时没有警告并按预期运行。
但是,当我尝试通过从协议中删除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)
答案 0 :(得分:1)
我设法重现了您的问题,假设您的示例中的parse
应该在JSONParser
类中。
对于满足协议的通用函数,协议还必须将其声明为通用。但是,将<T>
放在声明中并不能解决问题,因为它需要在函数签名中的某处使用。相关类型对此没有帮助。
您的选择是:
将协议中的parse
函数签名更改为通用,并在参数中的某处使用T
。
不要使用通用功能。
有一天,Apple将学习编译错误和分段错误之间的区别,但今天不是那一天。
答案 1 :(得分:0)
我仍然没有弄清楚它为什么会这样运作,但这就是它的样子; Generic参数需要是类签名的一部分,而不是函数签名。
class JSONParser<FutureValue>: DataParserType {
typealias ResultType = FutureValue
func parse(with data:Data) -> Future<FutureValue> { return Future(45 as! FutureValue) }
}