Сделать переменную доступной вне условного? - PullRequest
2 голосов
/ 22 мая 2011

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

-(void)someMethod {
    if (x == y) {
        NSString *string = [[NSString alloc] initWithString:@"Foo"];
        NSLog(string); // outputs "Foo" to console successfully
    }
    ...
    NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}

У меня вопрос: есть ли способ динамически создавать переменные в условном выражении и иметь возможность обращаться к ним в другое время, как если бы я объявил это в своем @interface?

РЕДАКТИРОВАТЬ Полагаю, я не очень хорошо это объяснил, я имел в виду, хочу ли я использовать его позже в других методах .

Ответы [ 3 ]

5 голосов
/ 22 мая 2011

Вам просто нужно объявить (и при желании инициализировать) переменную вне if.Так что-то вроде:

-(void)someMethod {

    NSString *string = nil;
    if (x == y) {
        string = [[NSString alloc] initWithString:@"Foo"];
        NSLog(string); // outputs "Foo" to console successfully
    }
    ...
    NSLog(string); 
}

РЕДАКТИРОВАТЬ

Чтобы ответить на ваше пояснение, здесь 'string' является локальной переменной, локальной для этого метода.У вас есть другие варианты, например, переменные экземпляра.Методы экземпляра, подобные этому (те, которые начинаются с '-'), будут иметь доступ к переменным экземпляра этого экземпляра (этого объекта).

Так что вы можете сделать:

@interface MyClass : NSObject {

    NSString *string; // <<-- This is an instance variable (aka "ivar")
}

- (void)someMethod;
- (void)someOtherMethod;
@end

@implementation MyClass

- (void)someMethod {

    string = @"Foo";
}

- (void)someOtherMethod {

    NSLog (string); 
   // will print "Foo" provided someMethod was called before this method
}


@end

Очевидно, что есть ещена это, чем вы можете получить в кратком ответе.Вы можете иметь глобальные переменные.Если вы новичок в этом языке, вы должны прочитать свойства как очень полезный инструмент для инкапсуляции переменных экземпляра (полезно, когда вы хотите правильно настроить mgmt памяти).Но, надеюсь, это поможет вам, по крайней мере, указать правильное направление.

1 голос
/ 22 мая 2011

Подумайте, что вы спрашиваете. Вы начинаете с:

-(void)someMethod
{   if (x == y)
    {   NSString *string = [[NSString alloc] initWithString:@"Foo"];
        NSLog(string); // outputs "Foo" to console successfully
    }
    ...
    NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}

Что бы вы хотели сделать вторым NSLog? Кажется, вы запрашиваете, чтобы он работал, если тело оператора if было выполнено, или как? Выдает динамическую ошибку «необъявленная переменная»?

Теперь вы, кажется, хотите:

-(void)someMethod
{   if (x == y)
    {   NSString *string = [[NSString alloc] initWithString:@"Foo"];
        NSLog(string); // outputs "Foo" to console successfully
    }
    ...
}

-(void)someOtherMethod
{
    NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}

Что вы хотите, чтобы произошло в someOtherMethod, если тело оператора if в someMethod не было выполнено?

Как указывает решение @ Daniel, вы можете ссылаться на переменную, если она находится в scope . В случае одиночного метода вы перемещаете точку объявления из if в тело включающего метода. В случае двух методов вы перемещаете его в класс - в качестве переменной экземпляра.

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

Аналогично тому, как переменная находится в scope , не означает, что она должна содержать действительное значение . Вот почему @Daniel помещает nil в переменную - вы знаете, было ли создано значение внутри тела if значением string, не равным nil.

Так что, возможно, это «динамическое» поведение, которое вы, похоже, ищете - вы должны объявить какой-то способ ссылки на значение (переменную), но вы указываете, было ли оно создано путем хранения некоторого стража (nil в этом case) в переменной.

1 голос
/ 22 мая 2011
-(void)someMethod {
    NSString *string = nil;
    if (x == y) {
        string = [[NSString alloc] initWithString:@"Foo"];
        NSLog(string); // outputs "Foo" to console successfully
    }
    ...
    NSLog(string); // Doesn't work, we're out of the scope of the "if" statement.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...