2017-10-29 11 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句を使用して拡張でジェネリック型の制約を導入しサポートしていません。ただし、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

関連する問題