方法定义是否可以指定参数必须是常量?

Le *_*ced 3 methods constants objective-c

所以,我想做的事情如下:

+ (void) replace_text_with: (NSString *) const predefined_text_style;
Run Code Online (Sandbox Code Playgroud)

我在其他地方的Constants.h和Constants.m文件中使用常量字符串定义了一些文本样式.

我想要求传递的参数predefined_text_style是其中一个常量,如果不可能将其专门限制为那些常量,至少要求它是某种常量.这可能吗?

bra*_*zzi 5

我对Objective-C的了解有点生疏,但我敢打赌,不可能将参数限制为字符串的子集.我建议使用枚举:

typedef enum {
    FOOMy1stValue,
    FOOMy2ndValue,
    FOOMy3rdValue
} FOOEnum;
Run Code Online (Sandbox Code Playgroud)

最终,根据枚举的值检索常量字符串:

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

如:

void FOORestrictedInput(FOOEnum e) {
    NSLog(@"Restricted string: %@", FOOGetStringFromEnum(e));
}
Run Code Online (Sandbox Code Playgroud)

这不是一个太好的解决方案,因为您可以传递整数来代替枚举的值,但至少参数的类型将记录您期望的内容.

另一种可能性是创建一个新类,其实例将存储字符串常量.这些实例将作为参数而不是字符串传递.理论上,除了用作常量的类之外,还可以创建此类的新实例,但是使用字符串比使用字符串更难.

无论如何,我觉得两种解决方案都是不必要的开销 我不担心过多限制可传递的值(至少在Objective-C中没有 - 在其他一些语言中它可能要容易得多).但是,由于我对您的背景知之甚少,因此这些是一些可能的解决方案.