2017-02-11 2 views
0

다음의 이유는 is이 false로 설정되어 있습니까?Swift : 하위 클래스의 기본 클래스 및 수퍼 클래스를 확인하는 방법

class Person : BaseClass { ... } 
class Parent : Person { ... } 
. 
. 
let parent = Parent() 
print("parent is BaseClass: \(parent.self is BaseClass)") 
// this prints 'parent is BaseClass: false' 

하위 클래스의 기본 클래스 또는 수퍼 클래스를 어떻게 확인할 수 있습니까? 특히 개체가 서브 클래 싱 된 깊이를 모른다면.

UPDATE : 다음 내 실수

print("parent is BaseClass: \(parent.self is BaseClass)") 
// this prints 'parent is BaseClass: true' 

사실이다하지만이 사람은

class GenericClass<T: BaseClass> { } 
. 
let myGeneric = GenericClass<Parent>() 
print("myGeneric is GenericClass<BaseClass>: \(myGeneric.self is GenericClass<BaseClass>)") 
// this prints 'myGeneric is GenericClass<BaseClass>: false' 

운동장에서 나는 다음과 같은 경고 받고 있어요되지 않습니다 :

Playground.playground을 : 'GenericClass'에서 으로 관련이없는 'GenericClass'유형이 항상 실패합니다.

그렇다면 기본 클래스에 대한 일반적인 관계를 어떻게 확인할 수 있습니까?

+0

제네릭의 부적절한 사용과 같은 느낌입니다. 해결해야하는 문제는 무엇이 문제라고 생각합니까? –

+0

그럼 간단합니다. GenericClass 및 모든 하위 클래스를 사용하여 무언가를 수행해야합니다. 런타임에 나는 관리 할 수있는 객체의 클래스를 모른다. 그래서 나는 그것으로 정확한 물건을 할 수 있는지 확인해야합니다. Swift는 일반적인 상속 여부를 확인할 수 없으므로 나에게 들립니다. 컴파일시에도 문제가 없어야합니다. 무엇이 나를 'is'연산자를 확장시키는 아이디어로 이끌어줍니다. – Dareon

+0

'GenericClass '의 하위 클래스를 보여줄 수 있습니까? 왜냐하면 당신은 당신의 모범을 전혀 갖고 있지 않기 때문입니다. –

답변

1

포함 된 유형을 유형으로 표시해야합니다. 여기에 해결책이 있습니다.

protocol BaseClass { } 
class Person : BaseClass { } 
class Parent : Person { } 

class GenericClass<T: BaseClass> { 
    typealias Contained = T 
} 

let myGeneric = GenericClass<Parent>() 
print("myGeneric is GenericClass<BaseClass>: \(type(of: myGeneric).Contained() is BaseClass)") 
+0

'myGeneric'의 타입이 컴파일 타임에 알려지기 때문에 이것은 정상적으로 작동합니다. 미러링 된 객체의 속성은 어떻습니까? 모든 속성을 반복 할 경우, 컴파일시에 타입은'Any'이지만'attr.value is BaseClass'와 같은 것은 어쨌든 작동 할 것입니다. 그러나 컴파일 타임에 Any에 'Contained'와 같은 멤버가 없기 때문에'type (of : myGeneric) .Contained()'가 작동하지 않습니다. 그렇다면 컴파일 타임에 우리가 "진짜"타입을 전혀 모르는 경우 어떻게 실행시 generic 타입을 검사 할 수 있습니까? – Dareon

+0

프로토콜 사용 방법에 대한 입문서가 필요한 것 같습니다. 나는 당신이 그 (것)들에있는 약간 연구를 건의한다. –

+0

좋아, 내 생각을 분명히하지 않은 것 같아. 내 사과. 다시 도전 해 볼게요. 나는 미러링 된 객체의 속성을 반복하고있다. 모든 속성 유형은'Any'라고 알려진 컴파일 타임에 있습니다. 그들 중 하나는'GenericClass '이거나'GenericClass '과 같은'BaseClass' 서브 클래스 중 일부가 될 것으로 기대합니다. 내'BaseClass'는 프로토콜이 아니며 그냥 기본 클래스라고합니다. 이 상황에서 나는'Any'에는 그런 것이 없기 때문에 Contained() 생성자를 호출 할 수 없다. 예상대로 컴파일러 오류가 발생합니다. 이 경우 일반 유형을 확인할 가능성이 있습니까? – Dareon

관련 문제