2016-03-08 73 views
0

我有一個名爲Foo的協議和一個名爲Bar的結構。 Bar符合Foo追加到Swift中的泛型數組

protocol Foo {}  
struct Bar: Foo {} 

追加一個Bar實例的Bar作品數組作爲預期。

var array = [Bar]() 
array.append(Bar()) 

現在,我有一個通用的結構稱爲Baz一個與符合Foo(例如Bar)類型初始化。

struct Baz<T: Foo> { 
    private(set) var array = [T]() 

    init() { 
     if T.self is Bar.Type { 
      // Error: Cannot invoke 'append' with an argument list of type (Bar) 
      array.append(Bar()) 
     } 
    } 
} 

試圖追加到以下錯誤數組結果:

Cannot invoke 'append' with an argument list of type (Bar)

爲什麼不這項工作預計 ?

順便說一句,使用的情況是這樣的:

​​3210
+2

可能類似'array.append(Bar()as T)'? – njzk2

+0

是的,鑄造到T固定它。不知何故,這個解決方案完全暗示了我哈哈。謝謝! – JWK

回答

1

您需要存儲在陣列的對象,並且是類型T的因此,你應該使用as! T

struct Baz<T: Foo> { 
    private(set) var array = [T]() 

    init() { 
     if T.self is Bar.Type { 
      array.append(Bar() as! T) 
     } 
    } 
} 
+0

您提供了與@ njzk2相同的解決方案(在評論中)。但是,你已經詳細說明了這個例子,所以我想可以把它標爲正確的......它需要被強制施放,所以謝謝指出。 – JWK

0

由於array保持單一類型T的元件,其必須符合Foo但不一定與Bar兼容。它看起來像你希望有一個陣列,可以容納任何符合Foo;在這種情況下,擺脫了仿製藥的完全和簡單的寫

private(set) var array = [Foo]() 

,然後在你的初始化將

init() { 
    array.append(Bar()) 
}