Доступ к переменной в разных классах - 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
}
}
Спасибо заранее
Альберто
Ответы
Ответ 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)
}