2016-10-27 25 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 } 
    } 
} 

的想法是,在泛型類型爲Void的情況下,它沒有任何意義(在我的情況)的一個函數時(命名爲bar在這個例子中)。因此,我只想在這個特定的上下文中爲這個函數默認實現。

當試圖做到上述我得到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>()