Как получить доступ к var расширения в другом классе?

Я работаю со Sprite Kit. Я хочу изменить изображение кнопки основного класса с помощью класса настроек. Как я могу сделать переменную в расширении (из класса настроек) доступной для основного класса?

Вот расширение:

extension ChangingDots {
override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    super.touchesBegan(touches, with: event)
    for touch in touches{

        let locationUser = touch.location(in: self)

        if atPoint(locationUser) == DCButton {

     var blackdot = SKSpriteNode(imageNamed: "AppIcon") //<--var I want to use


        }
    }


}
}

Вот использование в основном классе:

    blackdot.setScale(0.65)
    blackdot.position = CGPoint(x: CGFloat(randomX), y: CGFloat(randomY))
    blackdot.zPosition = 1
    self.addChild(blackdot)

У кого-нибудь есть лучшая идея смены изображений кнопок одного класса с другого?


person Jay23    schedule 28.10.2017    source источник


Ответы (3)


Если вы хотите использовать переменную в основном классе, ее необходимо создать в основном классе. Расширения предназначены для расширения функциональности, это означает функции и вычисляемые свойства.

Чтобы узнать больше, см. эту документацию: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

person Knight0fDragon    schedule 28.10.2017
comment
Моя конечная цель - создать в настройках ViewCotroller, где пользователь может изменять изображения кнопок. У вас есть лучший подход к этой проблеме? @KnightofDragon - person Jay23; 29.10.2017

Просто чтобы добавить сюда, есть способы «обходного пути» добавления сохраненных свойств в расширение. Вот статья, в которой описывается, как это сделать: https://medium.com/@ttikitu/swift-extensions-can-add-stored-properties-92db66bce6cd

Однако на моем месте я бы добавил это свойство в ваш основной класс. Расширения предназначены для расширения поведения класса. Кажется, это неправильный подход к проектированию, чтобы сделать основной класс ЗАВИСИМЫМ от вашего расширения.

Если вы хотите сделать его приватным, вы можете использовать fileprivate, чтобы ваше расширение могло получить к нему доступ, но сохранить его «частный» доступ. Например:

fileprivate var value: Object? = nil
person Shawn    schedule 28.10.2017
comment
Я хочу сделать представление настроек Cotroller, где пользователь может изменить изображения кнопок @Shawn - person Jay23; 28.10.2017

Извините, но вы заставили меня понять, что вы не можете добавлять сохраненные свойства в расширения. Вы можете добавлять только вычисляемые свойства. Вы можете добавить свою переменную blackdot в качестве вычисляемого свойства или объявить ее в своем основном классе вместо своего расширения. Если вы хотите попробовать вычисляемый способ, используйте это:

extension ChangingDots { 
   var blackdot:Type? { // Replace Type with SKSpriteNode type returned
       return SKSpriteNode(imageNamed: "AppIcon")
   }
   override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
     super.touchesBegan(touches, with: event)
     for touch in touches {
       let locationUser = touch.location(in: self)
       if atPoint(locationUser) == DCButton {
         blackdot = SKSpriteNode(imageNamed: "AppIcon") //<--var I want to use
       }
     }
   }
}

Таким образом, ваша переменная blackdot доступна только для получения, но НЕ для установки. Если вы хотите добавить возможность установить его, вам нужно добавить сеттер следующим образом:

var blackdot:Type? { // Replace Type with SKSpriteNode type returned
   get {
       return SKSpriteNode(imageNamed: "AppIcon")
   }
   set(newImage) {
       ...
   }
}
person Arrabidas92    schedule 28.10.2017
comment
Я думал, что вы не можете делать сохраненные свойства в расширениях, только вычислять - person Knight0fDragon; 28.10.2017
comment
Я получаю сообщение об ошибке: Использование необъявленного типа «Тип». В строке var blackdot:Type?@Arrabidas92 - person Jay23; 29.10.2017
comment
Вам нужно заменить Type желаемым типом, возвращаемым SKSpriteNode. - person Arrabidas92; 29.10.2017
comment
Теперь у меня есть: расширения не могут содержать сохраненные свойства @Arrabidas92 - person Jay23; 29.10.2017
comment
Извиняюсь. @Knight0fDragon прав. Вы не можете иметь сохраненные свойства в расширениях, а только вычисляемые свойства. - person Arrabidas92; 29.10.2017
comment
Моя конечная цель - создать в настройках ViewCotroller, где пользователь может изменять изображения кнопок. У вас есть лучший подход к этой проблеме? @Аррабидас92 - person Jay23; 29.10.2017