2016-10-17 4 views
0

이것이 가능한지 확실하지 않지만 나는 라고 생각합니다. 이전에 본 적이 있습니다.신속한 일반 <T>의 속성 및 메서드에 액세스

내 앱 전체에서 양식 객체에 대한 유효성 검사를 일부 수행하고 있으며이를 재사용 할 수있는 중심적인 방법을 원합니다. 나는 함께 온 다음

class RGOValidatedObject<T> { 
    var validationPredicate: ((RGOValidatedObject<T>) -> Bool)? 

    var isValid: Bool { 
     return true 
    } 
} 

는 내가 직접 서브 클래스보다는 RGOValidatedObject에 속성을 추가하는 것처럼 T.의 값을 반환하는 속성과 T의 방법으로 액세스 할 수있게하려면 다음 사항을 고려

RGOValidatedObject<String>().substringToIndex(1) 

이 난 그냥

이 가능 T.

서브 클래스 거의 것처럼, 나는 RGOValidatedObject에 액세스 T의 속성과 메소드 무슨 뜻입니까? 그렇다면 어떻게해야합니까? 나는 스위프트 제네릭의 개념에 익숙하지 않지만 그것들의 모양을 좋아한다.

+1

'RGOValidatedObject () .substringToIndex (1)'의 결과는 무엇을 기대합니까? –

+0

배열 인덱스가 범위를 벗어나는 예외를 기대하지만, 그다지 요점은 아닙니다. 컴파일러가'RGOValidatedObject'의'String' 메쏘드를 인식 할 것인가? –

+0

'T' 타입의 값 홀더 속성을 순서대로 추가해야하는 것처럼 보입니다. 'Optional 'enum 구조체와 매우 유사한 것을 받게 될 것입니다. 아마도'Optional' 타입 구현 전달 방법에 대한 지식이 문제를 해결하는 데 도움이 될 수 있습니다. 신속한 소스 코드를 파헤 치면 연구하려고 할 수 있습니다. –

답변

1

아니요,이 방법으로 전달하는 "리프팅"구문은 없습니다 (비슷한 기능에 대한 여러 논의가 있지만). 액세스하려면 let value: T 속성을 추가해야합니다.

이 문제의 다소 일반적인 버전은 Observable<T>입니다. 스위프트에서 완전히 투명하게 만들 수는 없으므로, T 메서드를 호출 할 수 있습니다 (KVO 마법과 같은 방식으로). 그것은 분명해야합니다.

+0

아, 그럴 수도 있습니다. 확인해 주셔서 감사합니다. –