나는 AnyClass
(AKA AnyObject.Type
)이 내가 AnyClass
요소 (Array<AnyClass>
)와 배열을 때, 나는 remove(Element:)
를 호출 할 수 Equatable
을 준수하고 싶다, 그러나 이것은 Equatable
에 맞도록 Element
이 필요합니다.`AnyObject.Type`을`Equatable`에 맞추기 위해 빨리 처리할까요?
0
A
답변
0
저는 실제로 당신이 습득하려고 시도하는 것이 가능하다고 생각하지 않습니다. 또는 당신이 이런 식으로 그것을 시도해야 할지를 생각하지 않습니다.
클래스는 일반적으로 자동차, 뷰 또는 완전히 다른 종류의 실재물을 나타냅니다. 그래서 말하기는 매우 어렵습니다. 모든 사용자 정의 클래스는 내가 작성한 다른 사용자 정의 클래스와 동일하게 만듭니다.
스위프트는 그 (것)들을 비교하는 방법을 모릅니다.
여기에서 원하는 것을 얻는 가장 간단한 방법은이 응용 프로그램에서 사용할 클래스의 일반 버전을 나타내는 사용자 지정 프로토콜/인터페이스를 정의한 다음 각 응용 프로그램이 해당 프로토콜을 준수하는지 확인하는 것입니다.
var objs = Array<MyAppClassesProtocol>()
하고 AnyObject
을 대체 AnyHashable
를 사용할 수 스위프트 3부터도 remove(element:)
1
를 사용 : 그럼 당신은 같은 것을 할 수 있어야합니다. 이것은 Equatable
프로토콜을 준수하는 모든 값을 나타냅니다. 대신
var array:[AnyObject] = []
의
그냥 할 수있다 (
var array:[AnyHashable] = []
이 http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value를 참조 쓰기 실제로는 복제본). – rmaddy
@rmaddy 아니요, 이것은 AnyClass에 대한 확장이 컴파일러에 의해 허용되지 않는다는 사실에 대한 질문입니다. 따라서 AnyClass가 제공된 스레드에서 사용 된대로 Equatable에 일치하지 못하게됩니다. –
이를 달성하기 위해 더 많은 노력을 기울이기 전에 영향을받는 클래스의 공통 분모 (예 : 프로토콜)를 찾을 수 있는지 고려하십시오. 이런 종류의 * AnyClass/AnyObject 가짜 제네릭 *은 공통점을 찾는 것보다 나쁩니다. – vadian