SKSpriteNode не имеет члена с именем '' - как получить доступ к переменной, объявленной в моем методе порождения?

Раньше я задавал другой вопрос о том, как получить доступ к глобальной переменной в Swift, но понял, что глобальная переменная не работает для моих целей. Немного фона:

Игра представляет собой математическую/матчевую игру. У игроков будет уравнение, и они должны получить овцу с соответствующим ответом.

У меня есть овцы, которые появляются на экране. Каждая овца содержит уникальное значение int (1–12), которое генерируется в моем методе spawnSheep:

var sheepValue: Int = Int(arc4random_uniform(UInt32(12))+1)

На экране появится несколько овец, поэтому у каждой будет свое значение. Раньше глобальная переменная sheepValue обновляла значение всех овец до самой последней появившейся овцы, тем самым сводя на нет любую форму «уникальных» номеров для всех овец. У меня есть значения, преобразованные в строки, которые будут видны на каждой овце.

Вот фрагмент того, где я пытаюсь получить доступ к sheepValue вне функции, в которой оно было объявлено:

 func checkCollisions() {
    var hitSheep: [SKSpriteNode] = []
    enumerateChildNodesWithName("sheep") { node, _ in
    let sheep = node as SKSpriteNode

    if CGRectIntersectsRect(sheep.frame, self.sandman.frame) {
    if sheep.sheepValue == self.equation {

        hitSheep.append(sheep)

        }

sheep.sheepValue получает ошибку: 'SKSpriteNode не имеет члена с именем "sheepValue"

Но, насколько я понимаю, я могу установить свойства для своего SKSpriteNode (овца) и получить к нему доступ в этом синтаксисе. Но не переменные/целые числа? Я не уверен, что я делаю неправильно.

Еще несколько соображений: могу ли я просто использовать строковые значения для проверки значения sheepValues?? Если овца появляется с sheepValue, равным 5, то на овцы и в консоли. Это строковое значение сохраняется и действует так, как я хочу, чтобы действовала переменная int. Я думаю просто использовать строковые значения, чтобы проверить, равно ли sheepValue уравнению игрока. Но это потребовало бы преобразования большего количества целых чисел в большее количество строк, что требует немного больше работы.


person Tyxc    schedule 04.03.2015    source источник
comment
Я думаю, вам нужно преобразовать переменную овцы в класс овец, где вы объявили свойство овцы.   -  person ZeMoon    schedule 04.03.2015
comment
Вот о чем я говорю: developer.apple. com/library/ios/documentation/Swift/Conceptual/   -  person ZeMoon    schedule 04.03.2015
comment
Благодарю вас! Я займусь этим. :D   -  person Tyxc    schedule 04.03.2015


Ответы (1)


Я понимаю это неправильно с вашим объяснением

import UIKit

class SKSpriteNode {
   var spriteTest:String = "SpriteKitTeste";
}

class Sheep: SKSpriteNode
{
   var sheepTest:String = "SheepTest";
}

let sheep = Sheep();
let someSprite:SKSpriteNode = sheep;

println(someSprite.sheepTest); //SKSpriteNode does not have a member named 'sheepTest';

суперкласс SKSpriteNode не может получить доступ к свойствам или методам класса Sheep.

решить эту проблему очень просто, вам нужно сначала привести к классу или, если вы используете swift, язык может понять, какой правильный тип.

let someSheepSprite = sheep as Sheep;
println(someSheepSprite.sheepTest);

Я считаю, что в вашем коде проблема будет решена, изменив линию приведения

func checkCollisions() {
var hitSheep: [SKSpriteNode] = []
enumerateChildNodesWithName("sheep") { node, _ in
let sheep = node as Sheep // <<<<<<< this line

if CGRectIntersectsRect(sheep.frame, self.sandman.frame) {
if sheep.sheepValue == self.equation {

    hitSheep.append(sheep)

    }
person ViTUu    schedule 04.03.2015
comment
Я вижу, я вижу. Я собираюсь попробовать это прямо сейчас и вернуться к вам. Я получил дополнительные советы от других, которые посоветовали мне сделать то же самое. Спасибо!! - person Tyxc; 04.03.2015