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


123

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

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

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




вы можете определить переменную или структуру вне класса, тогда вы сможете получить доступ к этой переменной во всем приложении.
— Чандни

Ответы:


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"

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.