2016-10-27 1 views
3

associatedtype을 포함하는 사용자 정의 유형이있는 상황에 처해 있습니다. 이 값이 Void 인 경우, 기본 동작 (전화 사이트를보다 편리하게 만들기 위해)을하고 싶습니다. 나는 아래의 예를 끓여하려고 :관련 유형이 Void 인 사용자 정의 유형 확장

protocol FooType { 
    associatedtype T: Any 
    var bar: (String) -> T { get } 
} 

struct Foo<T>: FooType { 
    let bar: (String) -> T 
} 

extension Foo where T == Void { // Compile error: "Same-type requirement makes generic parameter 'T' non-generic". 
    init() { 
     self.bar = { _ in return } 
    } 
} 

아이디어는 (bar라는 이름의 일반적인 유형 Void 인 경우에, 그것은 (내 시나리오) 이해가되지 않는 함수를 전달하는 것입니다 이 예에서). 따라서이 특정 컨텍스트에서이 함수의 기본 구현을 원할뿐입니다.

위의 작업을 수행하려고 할 때 Same-type requirement makes generic parameter 'T' non-generic은 매우 제한적일 수 있습니다. 특정 유형을 포함 할 때 Array 유형 이에 대한 해결 방법은 프로토콜을 도입하는 것이지만 Void에 대해서는 그렇게 할 수 없습니다. 스위프트 3에서 내가 원하는 것을 할 수 있습니까? 아니면 현재 이것이 한계입니까?

답변

1

Swift 3.1부터는 질문에 게시 된 코드가 작동합니다. 즉, 다음은 이제 원하는대로 작동합니다.

protocol FooType { 
    associatedtype T: Any 
    var bar: (String) -> T { get } 
} 

struct Foo<T>: FooType { 
    let bar: (String) -> T 
} 

extension Foo where T == Void { 
    init() { 
     self.bar = { _ in return } 
    } 
} 

let foo = Foo<String>(bar: { (t: String) in return "" }) 
let zoo = Foo<Void>() 
관련 문제