2016-11-30 4 views
2

제네릭 형식 요구 사항을 단지 참조 형식으로 제한하는 데 문제가 있습니다. 여기에 몇 가지 예제 코드입니다 :스위프트 일반 참조 유형

class WeakHolder<Element: AnyObject> { 
    weak var element: Element? 

    init(element: Element) { 
     self.element = element 
    } 
} 

protocol Animal: class { } 

class Dog: Animal { } 

let dog: Animal = Dog() 
let holder = WeakHolder<Animal>(element: dog) // Error: Using "Animal" as a concrete type conforming to protocol 'AnyObject' is not supported. 

내가 <Element: class>에 일반 요구 사항을 변경하는 경우, 나는 오류 class constraint can only appear on protocol declarations를 얻을.

제네릭의 제한 사항입니까? 프로토콜을 클래스로 표시하면 해당 프로토콜에 대한 약한 참조를 가질 수 있습니다. 제네릭에는 해당 사항이 없습니까?

+0

Dog는 프로토콜이므로, AnyObject가 아닙니다. –

+0

저의 작은 경험에 비추어 볼 때 이것은 스위프트 2.3의 제네릭에 대한 제한 사항 일 수 있습니다. 프로토콜 대신 클래스를 사용하여이 문제를 해결할 수도 있습니다. –

+0

구현시 프로토콜을 사용해야합니다. – Mark

답변

0

간단한 대답은 프로토콜이라는 제네릭 형식을 사용할 수 없다는 것입니다. 클래스가 어떤 어댑터 클래스 의미로 유형을 채택 요구하는 class/struct GenericType<TypeName: TypeConstraints> {}

let thing = GenericType<Type>() where Type is a class or struct that adheres to any constraints

프로토콜을하지만, 프로토콜 자체이 아직되지 않습니다 : 구문을 작성

는이 작품 명확한 방법합니다 유형.

제네릭은 어떤 시점에서 프로토콜을 지원할 수 있지만 일반적인 방식을 프로토콜 또는 제네릭으로 변경해야 할 수 있습니다. 당신의 구체적인 예가 장면 뒤에서 적은 양의 작업으로 가능할 수도 있지만, 어떤 시점에서 이것이 구현 될 수도 있습니다.

그들이 가고있는 방향을보고 싶다면 The Generics Manifesto을 살펴보세요. 그것을 감추는 것은 당신의 유스 케이스와 직접 관련이있는 것은 아무것도 찾지 못했지만 상당히 구체적이어서 문서의 매개 변수에 포함되지 않을 수 있습니다.

+0

아, 일반화 된 클래스 제약 조건이 내가 원하는 것입니다. Swift의 차후 버전에서 고려되고 있다는 것을 알고 있습니다. – Mark

0

내 특정 사건에서 일한 또 다른 해결책은 다음

class WeakHolder<Element: AnyObject> { 
    weak var element: Element? 

    init(element: Element) { 
     self.element = element 
    } 
} 

protocol Animal: class { } 

class Dog: Animal { } 

let dog: Animal = Dog() 
let holder = WeakHolder<AnyObject>(element: dog as AnyObject) 

요소를 액세스, 나는 단순히 내 프로토콜에 다시 내리 뜬을 수행해야합니다. 물론,이 클래스를 값 유형과 함께 사용할 때 컴파일 타임의 안전성을 잃어 버리게 될 것이지만, 그것은 제 상황에서는 문제가 아닙니다.