Доступ к переменной в другом классе — Swift

#class #methods #swift

#класс #методы #swift

Вопрос:

я получил два файла swift :

main.swift и view.swift

В main.swift у меня variable (Int) изначально установлено значение 0 .

С IBACtion помощью I я установил, что 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
    }
}
 

Заранее спасибо
Alberto

Комментарии:

1. Нам нужно посмотреть, как определяется переменная. Это определено в классе или структуре? Как вы пытаетесь получить доступ к значению в другом файле?

2. Он определен в классе. Я пытаюсь получить доступ к переменной в другом классе, просто набрав main().GetValue()

3. вводя main() , вы создаете новый экземпляр main класса со значением по умолчанию (0) для variable

4. В том, что вы нам рассказали, так много неизвестных. Во-первых, файлы на самом деле не имеют значения в swift. Это все о классах / структурах и экземплярах. Это main имя вашего класса (обычно классы пишутся с большой буквы)? Кроме того, используете ли вы Xib файл? Мне странно, что они используются IBAction с классом, называемым просто main . Обычно это подкласс UIKit или Cocoa view или класс контроллера.

5. да, нам нужно будет увидеть больше кода 🙂 здесь недостаточно продолжения

Ответ №1:

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

глобальный.swift:

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

Теперь вы можете получить доступ к этому mainInstance из всех ваших контроллеров представления, и имя всегда будет «Мой глобальный класс». Пример из ViewController:

ViewController:

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

Комментарии:

1. Это было именно то, что мне было нужно. Спасибо!

2. Спасибо. Я задавался вопросом об этом в течение 6 месяцев (вся моя карьера в Swift …) Теперь я узнал, как хранить глобальные переменные, доступные, настраиваемые и настраиваемые, с модификацией из любого места …!!!! ааааа, спасибо!!!

3. Это кажется хорошим ответом, но разве не является одной из наших целей как программистов воздерживаться от использования глобальных переменных?

4. Большое вам спасибо за это!!!! Избавил меня от всех этих проблем с использованием структур, NSUserDefaults, экземпляров классов и т. Д. И т. Д.!

5. Спасибо! сэкономил мне столько времени и разочарований: P

Ответ №2:

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

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

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

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