![](/img/trans.png)
[英]Can't create protocol that is restricted to Classes in Xcode 9.3 / Swift 4.1
[英]Swift Syntax Update? Classes not allowed in protocol. Can't fill SKTexture
我目前正在編寫有關創建iOS等距游戲的教程。 你可以在這里找到這個 。
我剛剛開始對Swift進行編碼,因為使用3個月以上的教程時會出現很多語法錯誤,所以我問自己最近Swift中是否有一些主要更新。
到目前為止,我自己或XCode本身都已設法解決了這些小問題,但是我對此無能為力:
protocol TextureObject {
class var sharedInstance: TextureDroid {get}
var texturesIso:[[SKTexture]?] {get}
var textures2D:[[SKTexture]?] {get}
}
這是我要設置的協議(與本教程中的完全一樣),但是XCode不允許我定義類變量。 錯誤代碼如下:
"Class properties are only allowed within classes:
use static to declare a static property"
將“類”替換為“靜態”(這對我來說沒有邏輯意義)並刪除協議(並定義了不使用協議即可繼承的類),這會導致此代碼中的另一個錯誤:
class TextureDroid: TextureObject {
class var sharedInstance: TextureDroid {
return textureDroid
}
let texturesIso:[[SKTexture]?]
let textures2D:[[SKTexture]?]
init() {
texturesIso = [[SKTexture]?](count: 2, repeatedValue: nil)
textures2D = [[SKTexture]?](count: 2, repeatedValue: nil)
//Idle
texturesIso[Action.Idle.rawValue] = [
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.N, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.NE, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.E, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.SE, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.S, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.SW, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.W, Action.Idle)),
SKTexture(imageNamed: "iso_3d_"+textureImage(Tile.Droid, Direction.NW, Action.Idle)),
]
該錯誤出現在我要填充紋理的所有行中
Immutable value 'self.texturesIso' may not be assigned to
這是我的問題:
如何解決第一個錯誤? 有沒有一種在協議內定義類的新方法?
是因為我設法消除了第一個錯誤,所以連接了這兩個錯誤,還是剛剛出現了第二個錯誤?
如何以正確的方式填充SKTexture? texturesIso.append也不起作用。
我對Swift Update正確嗎? 如果是的話,是否有Swift突然變化的概述,因為我找不到。
非常感謝任何人的幫助,在此先感謝。
本教程似乎使用的是較早版本的swift。 您可以使用使用較早的swift編譯器的舊版xcode,也可以更新代碼。 我將嘗試幫助您更新代碼。
只需將var類更改為static。 這不會導致第二個錯誤,只是編譯器在第一個錯誤之后停止,因此第二個錯誤不會顯示出來。
不變值'self.texturesIso'可能未分配給
var texturesIso:[[SKTexture]?] {get}
定義了一個getter但沒有setter,因此您無法設置self.texturesIso屬性。 將其更改為{get set},並且也有必要對textures2d屬性執行相同的操作,並將其更改為類中的vars。
除了回答這個特定問題外,當我下載教程代碼以進行編譯時,我還需要更改touchesEnded以使用Set而不是NSSet,它會破壞touches.anyObject,因此我改用touches.first。 另外,它試圖更改gameScene中的不可變圖塊,因此我將其更改為var。
注意:我只是下載了代碼,然后將其編譯並運行,我不確定該如何運行,但是對我來說似乎還可以。 swift是否具有類級別的靜態變量? 關於計算類變量和靜態變量有一些很好的信息,盡管它沒有討論問題的協議部分
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.