2014-10-12 1 views
0

프로토콜에 맞는 스위프트 일반 형식을 만들려고합니다.스위프 확장자의 프로토콜에 제네릭 유형 일치

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

제네릭을 사용하여 클래스/구조체/열거의 확장에 대한 올바른 구문은 다음과 같습니다

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

당신이 제네릭 형식 T을 지정할 필요가 없습니다, 그것은 이미 메인에 선언 된 것 정의. 지정하면 새 제네릭 유형을 정의하는 것과 같습니다.

+0

구현이 어떻게 작동할까요? 나는 다음과 같은 예를 시도 (IntegerLiteralConvertible와)과는 동작하지 않습니다 : '확장 미정 : 정적 IntegerLiteralConvertible을 {convertFromIntegerLiteral FUNC (값 : IntegerLiteralType을) -> 아마 { 반환 어쩌면 (값) } 을 }' 컴파일러는 T가 Int와 동일하지 않다고 불평합니다. : -? – cfischer

+1

'NilLiteralConvertible'에 대해서는 업데이트 된 답변을 참조하십시오. 'IntegerLiteralConvertible'에 관해서는, 나는 당신이 정수로 무엇을하고 싶습니까? enum이 generic을 사용하기 때문에 관련 값으로 사용할 수 없습니다. 정수 호환이 가능하다는 가정을 할 수 없기 때문에 – Antonio

+0

제네릭 형식의 구체적인 인스턴스화 방법이 있다면 (아마도 ) 프로토콜,이 경우 IntegerLiteralConvertible. 이것이 가능한가? – cfischer