2016-11-01 2 views
1

동일한 개체를 상속받은 2 개의 개체가 있습니다. 그리고 추가 객체 유형의 일반 객체입니다. 일반 개체 목록을 저장하고 싶지만 오류가 발생합니다.상속 오류가있는 일반 사항

//Error: Cannot convert value of Type Node to expected argument type Node

코드 :

class Pet { 

} 

class Cat: Pet { 

} 

class Dog: Pet { 

} 


public class Node<T> { 
public var value: T 

    public init(value: T) { 
     self.value = value 
    } 
} 

var list = [Node<Pet>]() 

//Error: Cannot convert value of Type Node<Dog> to expected argument type Node<Pet> 
list.append(Node<Dog>(value: Dog())) 

왜 이런 일이 무엇입니까? 어떤 제안?


편집 :

내가 노드를 노드 의 목록을 작성하고 추가 왜 캔트 개 종류의 애완 동물 인 경우?

+0

:

class Pet { } class Cat: Pet { } class Dog: Pet { } class Tiger: Cat { } public class Node<T> { public var value: T public init(value: T) { self.value = value } } 

은 당신이 그런 일을 할 수를 : Dog()))'및'list.append (Node (value : Cat()))'를 호출합니다. – holex

답변

3

스위프트는 유형에 따라 엄격합니다. Node<Pet>이 예상되는 경우 Node<Dog>을 추가 할 수 없습니다.


당신은 자신 Dog() as Pet에 의해 필요한 유형에 선택적으로 캐스트 할 수

: 개체를 액세스하고 올바른 유형을 얻을 필요가있는 경우

list.append(Node(value: Dog())) 
// or 
list.append(Node<Pet>(value: Dog())) 
// or 
list.append(Node<Pet>(value: Dog() as Pet)) 

나중에이 내리 뜬에 있습니다

if let myDog = list[0].value as? Dog { 
    print("woff woff") 
} 

working demo을 참조하십시오.

type casting에 대해 자세히 알아보십시오.

1

이 같은 재단이있는 경우 :`list.append (노드 (값 :이 시도 할 수

var list = [Node<Pet>]() 
list.append(Node(value: Dog())) 
list.append(Node(value: Cat())) 
list.append(Node(value: Tiger()))