Подтвердить что ты не робот

Доступ к переменной в разных классах - Swift

У меня есть два быстрых файла:

main.swift и view.swift

В main.swift у меня есть variable (Int), первоначально установленный на 0.

С IBACtion я установил, что variable будет 10, и все в порядке.

Однако, если я попытаюсь получить доступ к этому variable из view.swift, с простым вызовом типа main().getValue(), я всегда получаю 0, а не 10, даже если переменная имеет изменил его значение в main.swift.

Метод getValue() в main.swift выглядит следующим образом:

func getValue() -> Int {
return variable
}

ИЗМЕНИТЬ

Вот код (Перевод с итальянского: D)

import Cocoa

class Main: NSObject {

    var variable: Int = 0

    func getValue() -> Int {
        return variable
    }

    @IBAction func updateVar(sender: AnyObject!) {
        variable = 10
    }
}

class View: NSView {
    override func drawRect(dirtyRect: NSRect) {
       println(Main().getValue()) //Returns always 0
    }
}

Спасибо заранее Альберто

4b9b3361

Ответ 1

Существует важное различие между "файлами" в Swift и "классами". Файлы не имеют ничего общего с классами. Вы можете определить 1000 классов в одном файле или 1 классе в 1000 файлах (с использованием расширений). Данные хранятся в экземплярах классов, а не в самих файлах.

Итак, теперь к проблеме. Вызывая Main(), вы создаете совершенно новый экземпляр класса Main, который не имеет ничего общего с экземпляром, который вы подключили к вашему Xib файлу. Вот почему значение выводится как значение по умолчанию.

Что вам нужно сделать, это найти способ получить ссылку на экземпляр тот же, что и в вашем Xib. Не зная больше о архитектуре вашего приложения, мне сложно сделать предложение об этом.

Можно подумать, что вы можете добавить ссылку на свой экземпляр Main в свой Xib, используя IBOutlet в вашем View. Затем вы можете просто сделать self.main.getValue(), и он будет вызван на правильный экземпляр.

Ответ 2

Я решил это, создав общий основной класс, доступный для всех представлений. Создайте пустой файл swift, назовите его "global.swift" и включите его в свой проект:

global.swift:

class Main {
  var name:String
  init(name:String) {
    self.name = name
  }
}
var mainInstance = Main(name:"My Global Class")

Теперь вы можете получить доступ к этому mainInstance со всех контроллеров вашего представления, и имя всегда будет "My Global Class". Пример из viewController:

ViewController:

override func viewDidLoad() {
        super.viewDidLoad()
        println("global class is " + mainInstance.name)
    }