2014-11-14 3 views
10

C++에서 나오기 때문에 Swift에서 일부 메타 프로그래밍을 시도하고 있습니다. 예를 들어, 두 개의 숫자를 추가하는 메타 함수를 구현하고 싶습니다. 나는 이런 식으로 뭔가를 시도했다 :Swift에서 메타 프로그래밍

protocol IntWrapper { 
    class var value: Int { get } 
} 

struct A: IntWrapper { 
    static let value = 5 
} 

struct B: IntWrapper { 
    static let value = 7 
} 

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper { 
    static let value = T.value + U.value 
} 

그러나 이것은 작동하지 않습니다 : (.하거나 충돌, 때로는) 엑스 코드는 T.Type 구성원 value이없는 것을 불평

어떻게 구현할 수 있습니다 그런 기능?

+0

안녕하세요. 거의 1 년 후 ... 신속하고 Metaprogramming에 대한 소식이 있습니까? –

답변

8

static 저장된 속성은 일반 개체에서 (현재) 지원되지 않습니다. 내가 놀이터에 코드를 넣을 때, 나는 실제로이 오류를 얻을 : 당신은 주위를 얻을 수

Playground execution failed: <EXPR>:23:5: error: static variables not yet supported in generic types 
    static let value = T.value + U.value 
    ^~~~~~ 

을 대신 (어쨌든 처음에 원하는 것을되었을 수 있습니다) 계산 된 속성을 사용하여 :

struct Sum<T: IntWrapper, U: IntWrapper>: IntWrapper { 
    static var value: Int { 
     return T.value + U.value 
    } 
} 

참고 :이 계산 된 속성입니다 때문에, 당신은 var하지 letvalue를 선언해야합니다.

이러한 변경으로 println(Sum<A, B>.value)은 예상대로 12을 인쇄합니다.

+0

솔직히 말하면, 나는 (언어 의미론에서) 내가 원했던 것을 정말로 모르겠다. 최종 목표는 일단 모든 최적화가 활성화되면 'Sum .value'가 결과 바이너리 코드에서 상수로 감소된다는 것입니다. –

0

정의와 일치시키고 프로토콜을 다르게 구현해야합니다. 는 (I는 신속 개발자가 아닌,하지만 난에 유래에 사람들을 돕기로 나는 배우고했습니다.) 당신은 class var을 요구했다

protocol IntWrapper { 
    static var value : Int { get } 
} 
struct A: IntWrapper { 
    static var value : Int { get { 5 } } 
} 

,하지만 당신은 static let을 정의했다. 미묘한 차이가 있지만, 여기에 중요하다고 생각합니다.

+0

프로토콜에 정적 속성을 사용할 수 없으므로 시도하면 컴파일러에서 오류 메시지를 표시합니다. –