2016-05-26 5 views
1

Я возвращаю SKNode из одной функции, и мне нужно отправить ее на заказ SKNode. Я получаю ошибку Cannot assign value of SKNode to type GroundNode. Если я принудительно сбрасываю, он компилируется, но не выполняется во время выполнения. Что мне не хватает?Нельзя использовать SKNode для подкласса SKNode

// Custom node class 
class GroundNode: SKNode { 
     weak var entity: GKEntity! 
    } 

// Return node function 
func returnNode() -> SKNode { 
    ... 
    return node 
} 

// Where I am getting the error 
func setupNode() { 
    var ground: GroundNode 
    ground = returnNode() // error here. 
    //// ground = returnNode() as! GroundNode fails at runtime. 
} 

EDIT: Я получаю SKNode из файла SKS. Мой returnNode() просто введите дочерний элемент с именем и вернет его в мою функцию setupNode(). Мне нужно добавить свойство entity, поэтому я хочу отдать мой возвращенный SKNode в тип GroundNode.

Я видел this stackoverflow post.

Это работает с SKSpiteNode, но, по-видимому, не с SKNode, что для меня не имеет смысла.

Если я набросил свой SKNode из моего файла sks на GroundNode, он сработает во время выполнения.

+0

Могу я спросить, почему вы преследуете эту настройку? При назначении регулярного SKNode этому GroundNode вы обещаете любой логике, обращающейся к этой переменной, что это GroundNode - даже если это может быть не так, поскольку returnNode может возвращать объект _any_ SKNode. Без лишнего контекста это звучит как плохая идея для меня. – CloakedEddy

+0

Вы уверены, что в 'setupNode' вызов' returnNode' фактически возвращает экземпляр 'GroundNode'? Это не похоже ... Используйте отладчик, чтобы наблюдать, что на самом деле происходит. –

+0

Я думаю, что вы забыли установить свой собственный класс, я объясню это в своем ответе. –

ответ

1

на основе кода:

// Custom node class 
class GroundNode: SKNode { 
    weak var entity: GKEntity! = GKEntity() // or some custom initialization... 
} 

// Where I am getting the error 
func setupNode() { 
    var ground: GroundNode 
    ground = returnNode() as? GroundNode 
} 

Это произошло потому, что выход returnNode является общим SKNode и вы должны явно ваш кастинг на подклассы GroundNode.

EDIT: Хорошо, с обновлением, я думаю, что я понимаю ваш вопрос, вы забыли установить пользовательский класс для GroundNode:

enter image description here

+1

Мне нужно добавить имя модуля, но это исправлено. Сбой в других целях теперь, потому что имя модуля не совпадает, но это отдельная проблема. Благодаря! – Siriss

0

Я думаю, что это должно быть

func returnNode() -> GroundNode {

+0

Я пробовал, но я получаю SKNode из файла SKS. Он не может использовать SKNode для GroundNode. Если я принуждаю к приведению в действие, он падает во время выполнения, а не компилирует время. – Siriss

1

первый

returnNode() возвращает экземпляр класса SKNode. Он может также возвращать экземпляр производного класса (например, GroundNode), но сайт вызова не знает этого из объявления функции. Вы пытаетесь присвоить этот экземпляр переменной подкласса SKNode - GroundNode, который не подходит в ООП.

См Dynamic Binding ООП концепции:

В объектно-ориентированных языках программирования, переменная суперкласса типа может содержать подкласс экземпляра.

(возможно, кто-то может объяснить это более подробно, но это то, как вещи выглядят для меня)

второй

Type Casting. Когда вы подозреваете, что какая-либо переменная типа класса может содержать экземпляр производного класса, вы можете сделать литье типов, чтобы это подтвердить.

returnNode() возвращает экземпляр SKNodeИЛИ любого производного класса, но сайт вызова хочет обрабатывать только экземпляры производного класса (GroundNode), следовательно, одним из техники литья типа должен быть использован.

import GameplayKit 
import SpriteKit 

// Custom node class 
class GroundNode: SKNode { 
    var entity: GKEntity = GKEntity() 
} 

// Return node function 
func returnNode() -> SKNode { 
    // let's assume that you are correctly getting an instance 
    // of GroundNode class here, and return it from the function 
    // as of SKNode type 
    let returnNode: SKNode = GroundNode() 
    return returnNode 
} 

func setupNode() { 
    var groundNode: GroundNode? 

    // Type Casting 

    // Approach #1 
    let someNode = returnNode() 
    if someNode is GroundNode { 
     groundNode = someNode as! GroundNode 
    } 

    // Approach #2 
    groundNode = returnNode() as? GroundNode 

    print("groundNode = \(groundNode)") 
} 
+0

Это позаботилось о сбое, но сделало мой узел пустым, поскольку я назначал его на пустой GroundNode. – Siriss

+0

Экземпляр типа 'func returnNode()' должен ** фактически ** возвращаться во время выполнения ('GroundNode' или' SKNode')? Вы пытаетесь инициализировать «GroundNode» из '.sks'? Не могли бы вы пролить свет на то, что ** вы на самом деле пытаетесь достичь? Благодарю. –

+0

Благодарим вас за ответы. Я обновил свой вопрос. returnNode возвращает SKNode. Если я передам свой SKNode в GroundNode в 'returnNode()', я получаю сбой во время выполнения. – Siriss

 Смежные вопросы

  • Нет связанных вопросов^_^