2014-07-06 5 views
0

편의를 위해 약간의 실험에서 일부 응용 프로그램 특정 기능을 제공하도록 Array를 확장하고 싶습니다. 이 특정 확장은 모범 사례는 아니지만 신속한 문제를 해결하는 데 궁금합니다.범주/확장명의 필터 배열

는 사용자 정의 클래스 섹션을 감안할 때, (부분적으로 확장 클로저) 내 확장입니다 : 내가 얻을

extension Array { 

    func onlyFullSection() -> Array<Section> { 

     return self.filter { 
      (a:Section) -> Bool in 
      return a.isFullSection() 
     } 
    } 
} 

오류 : "T"는 "제"의 하위 유형이 아닙니다.

모든 종류의 소스 (유형 변경, 캐스팅 등 ...)로 고쳐 내려했지만 비슷한 오류가 발생했습니다.

이 다른 변형 :

extension Array { 

    func onlyFullSection() -> Array<Section> { 

     return (self as Array<Section>).filter { 
      (a:Section) -> Bool in 
      return a.isFullSection() 
     } as Array<Section> 
    } 

예외 : Cannot convert the expression's type 'Array<Section>' to type 'Array<Section>'

내가 잘못 뭐하는 거지에 대한 어떤 단서? 감사!

답변

0

섹션 []이 아닌 T []를 확장했기 때문입니다. 즉, Int []에 추가 메서드가 있습니다. 그것은 좋은 생각이 아닐 수도 있습니다 (심하게 부서지기 때문에).

Swift는 현재 [섹션]과 같이 전문화 된 제네릭 유형을 확장 할 수 없습니다.

그러나 만약 당신이 정말로, 정말로 그것을 원한다면, 여기

/// A brutal bit-cast of something to anything of the same size 
func reinterpretCast<T, U>(x: T) -> U 

을 다음과 같이 Apple은 다음과 같이 사용할 수 있습니다 설명 reinterpretCast를 사용 캐스트를 강제하는 한 방법입니다 :

extension Array { 
    func onlyFullSection() -> Section[] { 
     let sections : Section[] = reinterpretCast(self) 
     return sections.filter{ $0.isFullSection() } 
    } 
} 

하지만 제발하지 마십시오.

0

Array 클래스는 실제로 Array<T> 일반 클래스이므로 Array<T>을 확장하는 것이 문제입니다. 그리고 제네릭 유형 (예 : <T>에서 <Section>) 사이에 캐스트 할 수 없으므로 새로운 배열을 만들어 적절한 객체를 밀어 넣어야합니다.

17> extension Array { 
18.  func onlyFullSection() -> Array<Section> { 
19.   var ary = Array<Section>() 
20.   for s in self { 
21.    if (s as Section).isFullSection() { 
22.     ary.append(s as Section) 
23.    } 
24.   } 
25.   return ary 
26.  } 
27. } 

도우미 메서드를 만들어 일반 형식간에 변환 할 수도 있지만이 경우에는 불필요한 임시 개체 만 만들 수 있습니다.

언어가 여전히 유동적이어서 언어가 변경 될 수 있음을 기억하십시오. 제네릭 형식간에 변환 할 수있는 가능성은 거의 없지만 적어도 특정 제네릭을 확장 할 수 있기를 바랍니다.