Как создать глобальную переменную?

123

У меня есть глобальная переменная, которой нужно поделиться между моими ViewControllers.

В Objective-C я могу определить статическую переменную, но не могу найти способ определить глобальную переменную в Swift.

Вы знаете, как это сделать?

czzhengkw
источник
один ответ здесь stackoverflow.com/questions/24868120/…
Стив Розенберг,
Возможный дубликат Как создать глобальную переменную в Swift?
Ni Nisan Nijackle
вы можете определить переменную или структуру вне класса, тогда вы сможете получить доступ к этой переменной во всем приложении.
Чандни

Ответы:

209

Из официального руководства по программированию Swift :

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

Вы можете определить его в любом файле и получить к нему доступ в текущем moduleместе где угодно. Таким образом, вы можете определить его где-нибудь в файле вне любой области видимости. Нет необходимости, staticи все глобальные переменные вычисляются лениво.

 var yourVariable = "someString"

Вы можете получить к нему доступ из любого места в текущем модуле.

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

Как показано в этом ответе , в Swift вы можете инкапсулировать их structи получить доступ откуда угодно. Вы также можете определить статические переменные или константы в Swift. Инкапсулировать вstruct

struct MyVariables {
    static var yourVariable = "someString"
}

Вы можете использовать эту переменную в любом классе или где угодно

let string = MyVariables.yourVariable
println("Global variable:\(string)")

//Changing value of it
MyVariables.yourVariable = "anotherString"
codester
источник
3
Ваша структура вызывается MyVariables, поэтому MyViewStateвыглядит как ошибка копирования / вставки из stackoverflow.com/a/24868789/1187415 :)
Мартин Р
Спасибо, Мартин Р., да, я скопировал с него код
codeter 04
9
Если вы копируете код из другого ответа, вы должны указать это явно (со ссылкой на исходный ответ). Сравните stackoverflow.com/help/referencing .
Martin R
1
Понял, спасибо! Но есть ли разница между глобальной переменной и инкапсуляцией в структуру?
czzhengkw 05
3
Разве MyVariables не будут считаться глобальными? Какая разница, если мы объявим его как глобальную структуру или переменную?
Satyam
15

Глобальные переменные, которые определены вне любого метода или закрытия, могут быть ограничены по области с помощью ключевого слова private.

import UIKit

// MARK: Local Constants

private let changeSegueId = "MasterToChange"
private let bookSegueId   = "MasterToBook"
Дэн Кафлин
источник
32
Константа («let») не является переменной.
Майк Таверн
2
@MikeTaverne Вы правы, но вы можете ввести его как "var", тогда этот ответ будет в порядке. swifttipsnet.wordpress.com/2016/09/11/…
Милад Фаридния
4

если вы хотите использовать его во всех своих классах, вы можете использовать:

public var yourVariable = "something"

если вы хотите использовать только один класс, вы можете использовать:

var yourVariable = "something"

источник