我很難讓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