簡體   English   中英

Swift僅將協議限制為某些類型的類

[英]Swift confine protocol to certain types of class only

我有一個僅分配給SKScene對象的協議。 從根本上講,我可以強制執行某些屬性和方法,從而使我知道自己的場景都可以執行某些操作,從而創建一個管理器類。 例如,所以我可以創建一個教程場景,例如,第1級,第2級等。

  protocol GameSceneProtocol  {
        func performAction()
  }

因此,現在在我的經理中,我的場景有一個弱變量(經理在場景中初始化)

 weak var scene: SKScene?

我遇到的問題是我想調用與SKScene以及我的協議相關的方法。 例如

 scene.addChild(modal)
 scene.performAction()

我真正想要做的是:

weak var scene: SKScene, GameSceneProtocol

我使用此管理器的原因是因為我需要向場景中添加不同的模態視圖(同樣是教程和關卡),然后根據在這些模態中執行的操作來運行通用代碼。 這些模式和功能在不同場景中是相同的,這就是為什么我嘗試將它們移到單獨的類中的原因。

有什么辦法可以確保某個屬性屬於某種類型,但也符合協議?

我有一種感覺,我的設計在這里是錯誤的,應該有一種更好的方法來構造它。 可能創建一個基礎場景類,我的實際場景繼承自該類而不是協議。 這樣,我可以避免重復相同的代碼。

您想要的是一個子類

class SKSceneWithProtocol : SKScene, GameSceneProtocol

但是在這一點上,該協議本質上是沒有意義的,您也可以只在子類中執行代碼。

您的另一種選擇是在需要使用場景時將其投射到協議上

if let sceneProtocol = scene as? GameSceneProtocol
{
    //do stuff here
}

您可以使用協議組成來定義一個屬性,其中對象必須既是SKScene又是GameSceneProtocol 由於協議組合適用於協議(不適用於類),因此您還必須定義一個空的SKSceneProtocol並通過擴展將該一致性添加到SKScene

protocol SKSceneProtocol { }
extension SKScene: SKSceneProtocol { }

protocol GameSceneProtocol { ... }

var object: (SKSceneProtocol & GameSceneProtocol)? = nil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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