2016-10-27 3 views
3

associatedtypeを含むカスタムタイプがある状況です。これがVoidに等しい場合、私はコールサイトをより便利にするためにいくつかのデフォルトの動作をしたいと思います。 barという名前(アイデアは、ジェネリック型が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 } 
    } 
} 

:私はダウンに例を沸騰してみましたこの例では)。したがって、私はこの特定のコンテキストでこの関数のデフォルトの実装をしたいだけです。

上記を実行しようとすると、Same-type requirement makes generic parameter 'T' non-genericが非常に似ています。特定のタイプを含む場合はArrayタイプです。この問題を回避するには、プロトコルを導入することですが、Voidについてはできません。私は欲しいものをやることができるのですか、それともSwift 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>() 
関連する問題