2014-12-21 3 views
4

제네릭 타입 배열이있는 제네릭 클래스를 사용합니다. 아니, 배열의 클래스를 기반으로 일부 작업을 수행하고 싶습니다. 나는 2 개의 종류가있다 : 사람과 집 (아무 상속도).스위프트 제네릭 타입 캐스트

let allValues = [T]() 
if allValues[0] is Person { 
    let values = (allValues as [Person]) 
} 

을하지만 T는 '사람' 동일하지 않은 것처럼이 작동하지 않습니다 :하지만이 코드는 작동하지 않습니다. 나는 무엇을해야합니까? 어떤 도움을 주셔서 감사합니다.

답변

1

나는 올리버 Borchert대기 속도의 속도에 동의 : 이런 종류의 문제는 프로토콜을 사용하여 해결해야한다. 당신이 구문을 사용하는 방법에 대한 질문 캐스트를 수행 할 수 있습니다 그러나

는 :

  1. 당신의 경우가 0가 포함 된 배열 때문에 allValues을 충돌합니다 :

    let values = allValues as Any as [Person] 
    

    는 지금은이 문제를 참조하십시오 요소가 있고 첫 번째 요소 (존재하지 않음)에 액세스하고 있습니다.

  2. allValues에는 첫 번째 요소에 Person이 있고 두 번째 위치에 이 있어야합니다. 이것은 첫 번째 요소 만 평가 한 후에 위험한 캐스트를 만듭니다.

    수준의 생물 형태는 {}

    클래스 담당자 : 생물 형태 {} T와

    은 생물 형태에 같습니다.

내가 직접

class Things<T>{ 
    func doSomething() { 
     let allValues = [T]() 
     // populate allValues.... 
     if T.self is Person.Type { 
      println("List of Person") 
      let values = allValues as Any as [Person] 
     } 
    } 
} 

중요 T 형식을 평가하기 때문에 다음 버전이 더 안전하다고 생각 : 난 그냥 구문을 표시하려면이 코드를 제공했다. 나는 상황이 사람에게 특정한 논리를 포함하기 때문에이 abborach (다시, 의정서는 더 좋을 것입니다)를 좋아하지 않습니다. 이상 내용에 대해 알 필요가 없습니다 사람이유는은 제네릭 클래스입니다.

+1

글쎄, 네 말이 맞아, 끔찍한데 - 프로토콜을 사용 하겠지만 어쨌든 고맙다 :] – borchero

+0

환영합니다 :) –

3

당신은 이것을 할 수 없습니다 (또는, 적어도, 어떤 구불 구불하고 부지런한 농구를 뛰어 넘지 않고). TAny 유형과 같으며 다른 유형을 보유 할 수있는 유형이며 런타임에 as (또는 아마도 바람직하게는 as?)으로 실제 유형으로 되돌릴 수 있습니다.

그러나 제네릭은 이와 같이 작동하지 않습니다. 코드 내에서 일반 T은 컴파일 할 때 실제 유형으로 대체되며 그 유형은 Person이 아닐 수 있습니다. 그러한 경우 위의 코드는 어떤 작업을 수행합니까?

실제로 달성하고자하는 기본 기능은 무엇입니까? 사람과 집은 매우 다르기 때문에 둘 다 일반적으로 작동하는 기능을 실제로 작성해야합니까?

+1

일부 값을 기반으로 그래프를 그려보고 싶었지만 프로토콜을 구현할 수있는 아이디어가 있었습니까? – borchero

+1

예, 당신이 찾고있는 것과 비슷하게 들립니다. –

관련 문제