[英]Protocol conformance check in for loop?
我有兩個試圖做同樣事情的for循環:
for item in components where item is UpdateableComponent
{
item.update()
}
for item in components
{
if let component = item as? UpdateableComponent
{
component.update()
}
}
components
是Component
對象的數組。 UpdateableComponent
是一種協議,基本上可以按固定的間隔進行特定Component
更新。 Component
具有子類,例如Timer,Player,Enemy和其他與游戲相關的類,其中一些符合UpdateableComponent
協議,而某些則不符合。
第一個循環拋出Component
沒有成員更新的錯誤,這是正確的,但UpdateableComponent
協議確實存在。 為什么where子句不過濾數組? 第二個循環可以編譯,但是會給我想要的效果嗎? 它不如第一個干凈,我覺得他們(應該)達到相同的效果。
為什么第一個循環不是有效的選項,無法將components
數組過濾為符合UpdateableComponent
協議的對象?
這是因為在從Item到UpdatableComponent的第一個循環中沒有強制轉換。 編譯器只會看到您正在嘗試對組件類型的項目進行更新,而沒有考慮到您實際上僅對UpdateableComponent進行調用的事實(我們知道,我們只能從循環過濾器,但編譯器沒有)。 第二個循環具有直接強制轉換,因此編譯器會知道一個事實,即如果component不為nil,則if必須為UpdatableComponent類型。 第二個循環將給您相同的期望效果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.