Arrays 下行多协议阵列<;协议<;P1、P2>&燃气轮机;到数组<;P1>;

Arrays 下行多协议阵列<;协议<;P1、P2>&燃气轮机;到数组<;P1>;,arrays,swift,protocols,swift2.1,Arrays,Swift,Protocols,Swift2.1,所以我有两个数组 var arrayOne:Array<protocol<P1,P2>> var arrayTwo:Array<P1> var arrayOne:Array var arrayTwo:数组 其中P1和P2是协议 问题是如何进行下行操作 arrayTwo = arrayOne as Array<P1> arrayTwo=arrayOne作为数组 我从Xcode得到的是: Cannot convert value of type

所以我有两个数组

var arrayOne:Array<protocol<P1,P2>>
var arrayTwo:Array<P1>
var arrayOne:Array
var arrayTwo:数组
其中P1和P2是协议

问题是如何进行下行操作

arrayTwo = arrayOne as Array<P1>
arrayTwo=arrayOne作为数组
我从Xcode得到的是:

Cannot convert value of type 'Array<protocol<P1, P2>>' to specified type 'Array<P1>'
无法将“Array”类型的值转换为指定的“Array”类型

您需要强制转换数组的元素,而不是数组本身

arrayTwo = arrayOne.map { $0 as P1 }
或者正如MartinR所说,甚至不需要铸造元素

arrayTwo = arrayOne.map { $0 }
协议P1{}
结构A:P1{}
//大家都知道
设a=a()
// (1)
设p:P1=a
//或(2)
设p1=a为p1
让arr:Array=[]
//有类型
打印(arr.dynamicType)//数组
//(3)这里的数组被转换成不同的类型!!
设arr1:Array=arr.map{$0}
打印(arr1.dynamicType)//数组
//arr和arr1是不同的网络类型!!!
//arr2的元件可以如(1)或(2)中所述向下浇铸
//(3)仅相当于
类型别名U=P1
让arr3:Array=arr.map{(element)->U在
元素为U
}
打印(arr3.dynamicType)//数组
//数组必须转换,所有元素在arr3中从A向下转换为P1
//编译器知道类型,因此ii执行第(1)或(2)行中的工作

有趣的是,即使是通过带有
arrayTwo=arrayOne.map{$0}
的“身份映射”赋值也会使代码编译。这很奇怪,因为向上转换整个数组确实适用于子/超类,如中所示。@MartinR元素的类型是从arrayTwo声明中知道的,所以我认为这是“正常的”@user3441734它可能是“正常的”,但它绝对不是直观的。这就是斯威夫特的本来面目。这也没有可能的理由需要
映射
@MartinR hm。。。这可能更清楚地看到'typealias U=P1 var arrayTwo:Array=arrayOne.map{(e)->U in e}'所以没有强制转换,但是conversion@user3441734那个清洁器怎么样?正如马丁纳所说,甚至不需要铸造。
protocol P1{}
struct A: P1{}
// everybody knows, that
let a = A()
// (1)
let p: P1 = a
// or (2)
let p1 = a as P1

let arr: Array<A> = []
// has type
print(arr.dynamicType) // Array<A>
// (3) the array is converted to different type here !!
let arr1: Array<P1> = arr.map{ $0 }
print(arr1.dynamicType) // Array<P1>

// arr and arr1 are differnet types!!!
// the elements of arr2 can be down casted as in (1) or (2)
// (3) is just an equivalent of
typealias U = P1
let arr3: Array<U> = arr.map { (element) -> U in
    element as U
}
print(arr3.dynamicType) // Array<P1>


// the array must be converted, all the elements are down casted in arr3 from A to P1
// the compiler knows the type so ii do the job like in lines (1) or (2)