2016-07-27 49 views
0

在下面的代碼:夫特圖案匹配

protocol Serializable { 
} 

struct Owner: Serializable { 
    var name: String 
} 

struct Car: Serializable { 
    var owners: [Serializable] 
} 

let car = Car(owners: [Owner(name: "John"), Owner(name: "Mike")]) 

Mirror(reflecting: car).children.forEach { 
    switch $0.value { 
    case let value as Array<Serializable>: 
     print("Recognized!") 
    default: break 
    } 
} 

如果在

struct Car: Serializable { 
    var owners: [Serializable] 
} 

(所有者變量被定義爲[Serializable]

case let value as Array<Serializable>:會認識它,但在情況下:

struct Car: Serializable { 
    var owners: [Owner] 
} 

(業主VAR定義爲[Owner]

case let value as Array<Serializable>:不會承認它,雖然Owner符合Serializable協議? 有人可以解釋爲什麼嗎?

我想:

extension Array where Element: Serializable { 
    var representation: AnyObject { 
     return self.map { element in return "String" } 
    } 
} 

let arr: [Owner] = [Owner(name: "John"), Owner(name: "Mike")] 
arr.representation 

作品,讓斯威夫特承認[Owner][Serializable],爲什麼case let value as Array<Serializable>比賽[Serializable]但不[Owner]

+0

您是否嘗試過'的情況下,讓值,其中值是數組<序列化>'? –

+0

它不起作用。與'case let value as Array 相同' –

+1

有人刪除了回覆。他提到這不會編譯:let arr:[Owner] = [Owner(name:「John」),Owner(名稱:「Mike」)];讓arr2 = arr as? Array ...錯誤:Serializable不是Owner的子類型。 –

回答

0

在Swift中,協議具有與具體類型不同且獨立的內存表示。所以簡短的回答是Serializable的數組在內存上不同於符合Serializable的類型的數組,並且Swift當前沒有在兩者之間建立鑄造機制。在此WWDC談話

更具體的,細枝末節:

https://developer.apple.com/videos/play/wwdc2016/416/

+0

謝謝丹尼爾,會檢查視頻 –

0

Array<T>T是不同的類型,所以你不能指望一個人對一個協議的一致性是否對另一個有任何影響。

至於你的例子:

extension Array where Element: Serializable { 
    var representation: AnyObject { 
     return self.map { element in return "String" } 
    } 
} 

在這裏,你檢查的每個元素Element)的一致性,而不是數組作爲自己的類型。 Element是與Array<Element>分開的類型。

很難知道你應該在這裏做什麼,而沒有更多的信息,但我希望我已經回答了爲什麼你沒有得到你可能期望的結果。

+0

你對'擴展數組元素:可序列化的數組'的說法是正確的......數組和T是不同的類型......但我覺得奇怪的是Swift認識到[Owner]是[Serializable],因爲Owner實現了Serializable,但是在案件陳述中我不能使用[所有者]。 –

+1

'Array '和'Array '不一樣。擴展工作的唯一原因是因爲元素的類型 - 而不是通用本身 - 經過了一致性測試。'Owner'是'Serializable',但就是這樣。 –