2016-04-26 3 views
5

Учитывая этом примере Swift код:Доступ к глобальной переменной в Swift

var a = 10; 

func foo() -> Int { 
    var a = 20; 
    return a; 
} 

Как может функционировать Foo получить доступ к глобальной переменной а со значением 10 вместо локального а со значением 20?

Обратите внимание, что как a, так и foo не объявлены внутри класса, а в общем модуле. Я ищу способ сообщить Swift получить доступ к глобально определенному var вместо локально определенного.

+0

var a и function foo не объявлены внутри класса, а в модуле. – Marco

+1

Что называется модулем? Я думаю, вы можете сделать это, вызвав 'Module.a', но не пробовали. https://www.reddit.com/r/swift/comments/3xd560/scoperesolution_operator/ –

+1

Также, @Marco, не могли бы вы изменить свой вопрос, чтобы включить информацию, предоставленную вами в комментарии? Я думаю, что большинство разработчиков Swift предполагают, что мы работаем внутри класса без дополнительной информации. –

ответ

3

Я создал проект в Xcode, консольное приложение, цель здесь модуль. Итак, я назвал проект test, и цель имеет то же имя, поэтому в проекте сам модуль имеет также имя test. Любое глобальное определение будет подразумевать вызов test.. Подобно тому, как глобальные функции Swift являются неявным вызовом Swift., например Swift.print("...").

var a = 10; 

func foo() -> Int { 
    let a = 20; 
    Swift.print(test.a) // same as print(test.a) 

    return a; 
} 

test.foo() // same as foo() 

Выход:


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

2

Используйте self ключевое слово:

func foo() -> Int { 
    var a = 20; 
    return self.a; 
} 
+0

foo - это не метод, определенный в классе, это функция, поэтому самодоступность недоступна. – Marco

+0

Что делать, если var a = 10; не находится внутри одного класса? Вы не получите сообщение об ошибке. –

2
func foo(bar:Any) -> Int { 
     let a = 20 
     if bar is Bar { 
      let c = bar as? Bar 
      return c!.a 
     } 
     return a 
    } 
+1

Вы должны сделать 'if let c = bar как? Бар' вместо силового литья. – EmilioPelaez

Смежные вопросы