[英]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.