2017-05-16 14 views
0

나는 AnyClass (AKA AnyObject.Type)이 내가 AnyClass 요소 (Array<AnyClass>)와 배열을 때, 나는 remove(Element:)를 호출 할 수 Equatable을 준수하고 싶다, 그러나 이것은 Equatable에 맞도록 Element이 필요합니다.`AnyObject.Type`을`Equatable`에 맞추기 위해 빨리 처리할까요?

+0

이 http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value를 참조 쓰기 실제로는 복제본). – rmaddy

+0

@rmaddy 아니요, 이것은 AnyClass에 대한 확장이 컴파일러에 의해 허용되지 않는다는 사실에 대한 질문입니다. 따라서 AnyClass가 제공된 스레드에서 사용 된대로 Equatable에 일치하지 못하게됩니다. –

+0

이를 달성하기 위해 더 많은 노력을 기울이기 전에 영향을받는 클래스의 공통 분모 (예 : 프로토콜)를 찾을 수 있는지 고려하십시오. 이런 종류의 * AnyClass/AnyObject 가짜 제네릭 *은 공통점을 찾는 것보다 나쁩니다. – vadian

답변

0

저는 실제로 당신이 습득하려고 시도하는 것이 가능하다고 생각하지 않습니다. 또는 당신이 이런 식으로 그것을 시도해야 할지를 생각하지 않습니다.

클래스는 일반적으로 자동차, 뷰 또는 완전히 다른 종류의 실재물을 나타냅니다. 그래서 말하기는 매우 어렵습니다. 모든 사용자 정의 클래스는 내가 작성한 다른 사용자 정의 클래스와 동일하게 만듭니다.

스위프트는 그 (것)들을 비교하는 방법을 모릅니다.

여기에서 원하는 것을 얻는 가장 간단한 방법은이 응용 프로그램에서 사용할 클래스의 일반 버전을 나타내는 사용자 지정 프로토콜/인터페이스를 정의한 다음 각 응용 프로그램이 해당 프로토콜을 준수하는지 확인하는 것입니다.

var objs = Array<MyAppClassesProtocol>() 

하고 AnyObject을 대체 AnyHashable를 사용할 수 스위프트 3부터도 remove(element:)

1

를 사용 : 그럼 당신은 같은 것을 할 수 있어야합니다. 이것은 Equatable 프로토콜을 준수하는 모든 값을 나타냅니다. 대신

var array:[AnyObject] = [] 

그냥 할 수있다 (

var array:[AnyHashable] = []