簡體   English   中英

協議一致性檢查是否存在循環?

[英]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()
    }
}

componentsComponent對象的數組。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM