2015-01-15 3 views
0

에서 사용자 지정 액세스 연산자를 쓰기 내가 소유되지 않은 참조의 배열이 헬퍼를 구현 : 이제스위프트

class Unowned<T: AnyObject> 
{   
    unowned var value : T  

    init (value: T) { self.value = value } 
    func get() -> T { return self.value } 
} 

를, [ Unowned<Foo> ]을 할 수 있습니다. 그러나 기본 개체를 검색하기 위해 추가 get() 메서드를 사용하는 것에 만족하지 않습니다. 그래서 저는 맞춤형 이진 연산자를 쓰고 싶습니다. 나는 나가 객체

  1. 좌가 obvisouly입니다 :

    for unownedFoo in ArrayOfUnownedFoos 
    { 
        var bar : Int = unownedFoo-->method() 
    } 
    

    나의 현재 접근을 할 수있는 대한 -->

    infix operator --> { } 
    func --><T> (inout lhs: Unowned<T>, inout rhs:() -> Int) -> Int 
    { 
    } 
    

    에게 나는이 뒤에 있었다 아이디어를 정의하는 것입니다 배열, 내가 전화를 수행하고 싶습니다

  2. rhs 내가 전화하고 싶은 방법입니다. 이 경우 method()은 매개 변수를 취하지 않고 Int을 반환하므로
  3. 반환 값은 int입니다.

그러나, 다음과 같은 문제가/불확실성이 발생할 :

  1. 이 올바른 방법인가?
  2. 위의 가정이 맞습니까?
  3. 추출 된 Unowned<T>의 인스턴스에서 제공된 폐쇄 rhs을 어떻게 호출 할 수 있습니까? (의사 코드) lhs.value.rhs(). method()이 정적이라면 T.method(lhs.value)을 수행 할 수 있습니다. 그런 다음 메소드의 이름을 추출하여 좀 더 일반적인 것으로 만들어야합니다.
+0

'Int'를 사용하는'->'에 대한 후보 코드에서'T'를 (를) 사용 했습니까? 또는 두 번째 유형 매개 변수, 예를 들어'V'? – GoZoner

+0

그 이유는 메서드의 반환 형식을 참조하기 때문입니다. 물론,보다 일반적인 버전에서 이것은 다른 일반적인 유형이어야합니다. 'V'는 각각 호출 된 메소드의 리턴 유형입니다. –

답변

1

어쩌면 접미사 연산자가 다소 간단 할 수도 있습니다.

postfix operator * {} 

postfix func *<T>(v:Unowned<T>) -> T { 
    return v.value 
} 

// Usage: 
for unownedFoo in ArrayOfUnownedFoos { 
    var bar : Int = unownedFoo*.method() 
} 
+0

네, IMO가 더 융통성이 있기 때문에 선호합니다. 나는 또한 처음에 시도했지만 호출에'.'을 추가하는 것을 잊어 버렸고 컴파일러는'*'가 2 진 연산자가 아니므로 원래의 질문에 이르게했다. –

1

사용 뭔가 같은 : 다음

func --> <T:AnyObject, V> (lhs: Unowned<T>, rhs: (T) -> V) -> V 
{ 
    return rhs (lhs.get()) 
} 

과로 사용 : 특히

for unownedFoo in ArrayOfUnownedFoos 
{ 
    var bar : Int = unownedFoo-->{ (val:Int) in return 2*val } 
} 

, 당신은 그 자체 것과 method()를 사용하지 않는 함수 호출입니다 -하는 당신 method()이 실제로 클로저를 반환하지 않는 한 아마 원하지 않을 것입니다.

+0

네, 바로 그게 문제입니다. 이상적으로는 메소드 이름을 직접 사용하고 싶지만 클로저가 충분한 해결 방법입니다. –