将通用类型与Swift扩展中的协议一致

时间:2014-10-12 17:17:13

标签: generics swift protocols

我试图使Swift泛型类型符合扩展中的协议。这是类型:

enum Maybe<T>{
    case Nothing
    case Something(T)

    init(){
        self = .Nothing
    }

    init(_ something: T){
        self = .Something(something)
    }

}

我希望它符合的协议是NilLiteralConvertible

如果我尝试扩展,我会遇到一堆疯狂的错误:

extension Maybe<T>: NilLiteralConvertible{

}

如果我在Maybe<T>的主要定义中声明,我只能实现它。到底是什么???

enum Maybe<T>: NilLiteralConvertible{
    case Nothing
    case Something(T)

    init(){
        self = .Nothing
    }

    init(_ something: T){
        self = .Something(something)
    }


    // NilLiteralConvertible
    static func convertFromNilLiteral() -> Maybe<T> {

        return Maybe<T>()

    }

}

1 个答案:

答案 0 :(得分:1)

使用泛型的类/结构/枚举扩展的正确语法是:

extension Maybe : NilLiteralConvertible {    
    static func convertFromNilLiteral() -> Maybe {
        return .Nothing
    }
}

因此您不必指定通用类型T,它已在主要定义中声明。如果您指定它,就像您正在定义新的泛型类型