从另一个通用枚举初始化通用Swift枚举?

从另一个通用枚举初始化通用Swift枚举?,swift,generics,enums,Swift,Generics,Enums,我正在尝试为我的泛型枚举编写一个初始值设定项,它接受Alamofire的泛型结果枚举并将其转换为我自己的结果类型。我得出的结论如下: public enum Result<Value, Error: ErrorType> { case Success(Value) case Failure(Error) public init(result: Alamofire.Result) { switch(result) { case

我正在尝试为我的泛型枚举编写一个初始值设定项,它接受Alamofire的泛型结果枚举并将其转换为我自己的结果类型。我得出的结论如下:

public enum Result<Value, Error: ErrorType> {
    case Success(Value)
    case Failure(Error)

    public init(result: Alamofire.Result) {
        switch(result) {
        case Alamofire.Result.Success(let val):
            self = MyFramework.Result.Success(val)
        case Alamofire.Result.Failure(let err):
            self = MyFramework.Result.Failure(err)
        }
    }
}

这似乎是编译器推断
Alamofire.Result
的泛型参数的方式有问题

你可以通过改变它来修复它

init(result: Alamofire.Result) {

init(结果:Alamofire.result){
这样,将显式指定泛型参数(与结果类型的参数相同)


我还推荐您,因为它给出的错误消息没有什么帮助。

正如jtbandes所建议的,显式指定泛型参数类型可以消除神秘的编译器错误。但是,一旦解决了这个问题,我会遇到更神秘的segfault

经过一番尝试后,删除对
MyFramework
的引用似乎可以解决任何原因造成的SEGFULT问题。以下代码编译良好:

public enum Result<Value, Error: ErrorType> {
    case Success(Value)
    case Failure(Error)

    public init(result: Alamofire.Result<Value, Error>) {
        switch(result) {
        case Alamofire.Result.Success(let val):
            self = .Success(val)
        case Alamofire.Result.Failure(let err):
            self = .Failure(err)
        }
    }
}
公共枚举结果{
案例成功(价值)
案例失败(错误)
public init(结果:Alamofire.result){
开关(结果){
案例Alamofire.结果.成功(let val):
自我=.Success(val)
案例Alamofire.Result.Failure(let err):
self=.Failure(错误)
}
}
}

显式指定泛型参数可以消除奇怪的编译器错误,但解决该问题会发现更奇怪的SEGFULT。在反复使用它之后,似乎是对
MyFramework
的引用导致了它。有没有想过为什么会出现这种情况?我在我的文章中总结了我的发现答:我在测试时没有注意到这一点,但是你的代码所处的环境比我的简单测试文件更复杂。同样,我认为你应该在bugs.swift.org上提交一个bug,以便有人可以查看它(如果它还不是已知的问题)。可以;在提交错误报告之前,我将尝试进一步隔离此问题。谢谢您的帮助。
init(result: Alamofire.Result<Value, Error>) {
public enum Result<Value, Error: ErrorType> {
    case Success(Value)
    case Failure(Error)

    public init(result: Alamofire.Result<Value, Error>) {
        switch(result) {
        case Alamofire.Result.Success(let val):
            self = .Success(val)
        case Alamofire.Result.Failure(let err):
            self = .Failure(err)
        }
    }
}