Может ли определение метода указать, что параметр должен быть константой?

Итак, я хочу сделать что-то вроде:

+ (void) replace_text_with: (NSString *) const predefined_text_style;

Где я определил некоторые стили текста, используя константные строки в файле Constants.h и Constants.m в другом месте.

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

1 ответ

Решение

Мои знания в Objective-C немного устарели, но держу пари, что невозможно ограничить параметры подмножеством строк. Я бы порекомендовал использовать перечисления:

typedef enum {
    FOOMy1stValue,
    FOOMy2ndValue,
    FOOMy3rdValue
} FOOEnum;

В конце концов, получить константные строки на основе значения перечисления:

NSString *FOOGetStringFromEnum(FOOEnum e) {
    static NSString *strings[] = {
        @"My first value",
        @"My second value",
        @"My third value"
    };
    return strings[e];
}

Как в:

void FOORestrictedInput(FOOEnum e) {
    NSLog(@"Restricted string: %@", FOOGetStringFromEnum(e));
}

Это не слишком удачное решение, потому что вы можете передавать целые числа вместо значений перечисления, но, по крайней мере, тип параметра документирует то, что вы ожидаете.

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

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

Другие вопросы по тегам