2017-10-29 1 views
1

내 형식 확장에서 형식간에 몇 가지 연결을 소개하고 싶습니다. 다음 예제를 고려하십시오.Swift 확장자에서 래퍼 유형 인수를 사용하는 방법

struct Wrapper<T> { 
    var target: T? 
} 

struct Container<T> { 
    var wrapper: T? 
} 

extension Container where T == Wrapper<Any> { 

    func unwrap() -> Any { 
     return wrapper!.target! 
    } 


} 

이 코드는 컴파일되지만, 이것을 사용하고 싶습니다. 코드 위

var wrapper = Wrapper<String>() 
wrapper.target = "foo" 
var container = Container<Wrapper<String>>() 
container.wrapper = wrapper 
let string: String = container.unwrap() 

그래서 명확하게하기 위해 컴파일 오류

Container<Wrapper<String>>' is not convertible to 'Container<Wrapper<Any>> 

로 끝납니다. 확장 제한에서 유형 인수가 새로운 메소드의 리턴 유형임을 표시하는 방법이 있습니까? 그래서 순간

extension Container where T == Wrapper<NEWTYPEARGUMENT> { 

    func unwrap() -> NEWTYPEARGUMENT { 
     return wrapper!.target! 
    } 

} 

답변

2

somelike 사용될 수 스위프트는 어디에 절을 사용하여 확장에 제네릭 형식 제약을 도입 지원하지 않습니다. 그러나 where 절을 사용하여 제네릭 함수에 형식 제약 조건을 직접 도입하여 수행하려는 작업을 성취 할 수 있습니다.

extension Container { 
    func unwrap<U>() -> U where T == Wrapper<U> { 
     return wrapper!.target! 
    } 
} 

var wrapper = Wrapper<String>() 
wrapper.target = "foo" 
var container = Container<Wrapper<String>>() 
container.wrapper = wrapper 
let string: String = container.unwrap() //"foo" 
+0

감사합니다. – dagi12

관련 문제