我很难让Swift了解符合两种协议的对象数组与符合其中一个的数组相同。符合多种协议的Casting类型作为单个协议
比方说,我有两个协议,可识别并命名的:
protocol Identifiable {
var identifier: Int { get }
}
protocol Namable {
var name: String { get }
}
这将打印符合这些协议对象的数组信息两个功能:
func printIdentifiers(itemsToPrint: [Identifiable]) {
for (itemNumber, item) in itemsToPrint.enumerate() {
print("\(itemNumber): \(item.identifier)")
}
}
func printNames(itemsToPrint: [Namable]) {
for (itemNumber, item) in itemsToPrint.enumerate() {
print("\(itemNumber): \(item.name)")
}
}
然后两个结构即符合这些协议:
struct Friend: Identifiable, Namable {
var identifier: Int
var name: String
}
struct Dog: Identifiable, Namable {
var identifier: Int
var name: String
}
然后说我有一个
let jeff = Friend(identifier: 232314, name: "Jeff")
let fido = Dog(identifier: 45678, name: "Fido")
let identifiableAndNamableItems: [protocol<Identifiable, Namable>] = [jeff, fido]
斯威夫特有没有问题,当我给你jeff
给一个变量是Namable
:
let namableJeff: Namable = jeff //This is fine!
但它怪胎的时候我尝试做:符合这两个协议的项目rray
printNames(identifiableAndNamableItems)
无法将类型[protocol < Identifiable,Namable>]的值转换为 预期参数类型[Namable]
任何想法为什么? Swift直觉地知道,类型为protocol<Identifiable, Namable>
的变量可以分配给类型为Namable
的变量,因为任何符合两个协议的对象都必须仅符合其中一个协议。但它不明白符合两种协议的项目数组可以分配给符合其中一种协议的项目数组。
“但它不明白符合两种协议的项目数组可以分配给符合其中一种协议的项目数组”正确,因为“项目数组符合协议“实际上并不是一个完整的类型。请参阅我的问题在这里的讨论:http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself – matt