2014-11-11 2 views
1

은과 같이 열거에 StringLiteralConvertible을 채택하려고 할 때 :StringLiteralConvertible에 열거 형을 사용할 수 있습니까?

enum Component: StringLiteralConvertible { 
    case Static(String) 
    case AnyInt 

    typealias ExtendedGraphemeClusterLiteralType = String 
    typealias UnicodeScalarLiteralType = String 

    init(unicodeScalarLiteral value: UnicodeScalarLiteralType) { 
    } 
    init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) { 
    } 
    init(stringLiteral value: String) { 
    } 
} 

나는 다음과 같은 오류가 점점 오전 다음 초기화의 각

Variable 'self' used before initialized 

합니다.

NSHipster에 따르면 올바른 프로토콜을 따르려면 문자열 리터럴을 사용하고 원하는 클래스/구조체의 개체를 반환하는 클래스 func를 재정의해야합니다. 이와 같이 :

static func convertFromStringLiteral(value: String) -> CGPoint { 
    return NSPointFromString(value) // CGPointFromString on iOS 
} 

반자동 신속 업데이트에서 변경 되었습니까? enum으로 StringLiteralConvertible을 채택 할 수 있습니까?

+0

Swift init 메소드는 일반적으로 Objective-C에서와 같이'self'를 설정할 필요가 없지만'enum''''' 메소드는 특별한 경우입니다. 아래 @ MartinR의 대답을 참조하십시오. –

답변

4

StringLiteralConvertible 프로토콜이 변경되어 convertFromStringLiteral 기능이 더 이상 존재하지 않습니다.

이미 필요한 초기화 프로그램이 있습니다. 오류는 self에 값을 지정하지 않는다는 것입니다. 예제 구현 :

enum Component: StringLiteralConvertible { 
    case Static(String) 
    case AnyInt 

    init(stringLiteral value: String) { 
     self = Static(value) 
    } 

    init(extendedGraphemeClusterLiteral value: String) { 
     self = Static(value) 
    } 

    init(unicodeScalarLiteral value: String) { 
     self = Static(value) 
    } 
} 

let comp : Component = "Foo" 
관련 문제