Swift function that takes a specific protocol array can't take an array of types conforming to such protocol

Originator:oscar
Number:rdar://23499056 Date Originated:11/11/2015
Status:Duplicate of 18596002 Resolved:
Product:Developer Tools Product Version:Xcode 7.1.1
Classification: Reproducible:Always
 
Summary:
Having a protocol A and a struct X conforming to A, if a function takes an array of A and you pass an array of instances of X, the compiler throws an error: Cannot convert value of type `[X]` to expected argument type `[A]`

Steps to Reproduce:
1. Define a simple protocol
protocol A {
	var a: String { get set }
}

2. Define a struct that conforms to that protocol
struct X: A {
	var a: String
}

3. Define a function that takes an array of As
func takesAs(aas: [A]) {
	// Something
}

4 . Create an array of Xs
let letters = ["A", "B", "C", "D"]
let xs = letters.map { X(a: $0) } // xs is of type [X]
takesAs(xs) // Cannot convert value of type `[X]` to expected argument type `[A]`

let xs2: [A] = letters.map { X(a: $0) } // xs2 is casted to type [A]
takesAs(xs2) // Works as expected

Expected Results:
The function expecting an array of protocols accepts an array of types conforming to that protocol as parameter.

Actual Results:
The function expecting an array of protocols doesn't accept an array of types conforming to that protocol as parameter and errors with "Cannot convert value of type `[X]` to expected argument type `[A]`"

Version:
Xcode 7.1.1, Swift 2.1

Comments

Actually, you just have to type it to make it work.

let xs: [A] = letters.map { X(a: $0) }

Which makes sense.

By michael.nisi at Dec. 2, 2015, 8:19 a.m. (reply...)

I have to confirm this.

By michael.nisi at Dec. 1, 2015, 8 p.m. (reply...)

Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!