2014-10-16 13 views
1

所以我想創建符合特定協議的實例。我想創建符合TestProtocol的A或其他類的實例。我不能在Playground中運行這段代碼,所以我不知道什麼是錯的?或者更好,這應該如何解決?使用泛型存儲和生成類的實例

protocol TestProtocol { 
    init(value: Int) 
} 

class A : TestProtocol { 

    init() {} 
    required init(value: Int) { 

    } 
} 

func generateWithInstances<T : TestProtocol>(item: T, #numberOfInstances: Int) -> [T] { 
    var list: [T] = [] 
    for index in 1...numberOfInstances { 
     list.append(T(value: index)) 
    } 
    return list 
} 

var list: [TestProtocol] = [] 
let instanceOfA = A() 

list.extend(generateWithInstances(instanceOfA, numberOfInstances: 10)) 

更新

Arrayextend s不支持多態性(兩個陣列之前和之後延伸必須是相同的類型)。

extension Array {  

    ... 

    mutating func extend<S : SequenceType where T == T>(newElements: S) 

    ... 

} 

回答

1

這是Swift中的代碼崩潰編譯器或遊樂場的錯誤。 (應提供一個有用的錯誤消息。)

正如你在你的更新說明,它不工作的原因是generateWithInstances返回A S([A])數組,extend要求A是相同的TestProtocol

'TestProtocol' is not identical to 'A'

instances不能因爲TestProtocol被鑄造到[TestProtocol]不是A亞型。

但是,你可以把一個對象在使用append時間:

for obj in instances { 
    list.append(obj) 
} 

你可以寫Array不需要類型平等的擴展。