返回

If 语句外用字符串:API 调用的有效方法

IOS

从 If 语句中获取字符串传递给 API 调用

问题分析

代码示例展示了一种常见的编程困境:在 if 语句的不同分支中初始化一个字符串变量,然后希望在语句块之外使用这个字符串。问题在于,在每个 ifelse 块内部声明的变量(比如代码中的 usersID)拥有块级作用域,仅在当前代码块内部有效。一旦程序执行离开该代码块,这些变量将不再可用, 这就是编译器抛出“unused variable”警告的原因。最终导致API调用的字符串变量是无法获得的,导致程序运行错误。我们需要找到一种方法来声明一个变量,使其在 if 语句外部作用域可见。

解决方案

方案一:在 if 语句之前声明变量

解决此问题的一个直接方法是在 if 语句之前声明变量 usersID,然后分别在各个 if 分支中对其进行赋值。

步骤:

  1. if 语句块之前声明 usersID 属性为可变字符串 NSMutableString 或者普通字符串 NSString 类型,用于存储最后获得的字符串。
  2. 在不同的 if 条件分支下,将符合条件的字符串赋值给之前定义的 usersID

代码示例:

@property (nonatomic, strong) NSString *usersID;

// 获取存储的叶子缩写和主题 ID
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *leafAbbreviation = [defaults objectForKey:[NSString stringWithFormat:@"leafAbbreviation"]];
NSString *themeID = [defaults objectForKey:[NSString stringWithFormat:@"themeId"]];


//声明属性 确保在if外部可见
NSMutableString *usersID = [NSMutableString string];
// 根据 Leaf 和 Theme 设置用户 ID
if ([leafAbbreviation isEqualToString: @"new"] && [themeID isEqualToString: @"2"]) {
  [usersID setString:@"728"];
}
else if ([leafAbbreviation isEqualToString: @"new"] && [themeID isEqualToString: @"3"]) {
    [usersID setString:@"275"];
}
else {
    [usersID setString:@"486"];
}
  
// API 调用
NSString *path = [NSString stringWithFormat:@"v1/%@/media/?client_id=xxx", usersID];

此方法可以确保 usersID 在整个 ViewController.m 的上下文中可用,并避免未使用变量的警告,并且能将其赋值后正确地传给 API 调用。需要注意,如果需要修改字符串,使用 NSMutableStringNSString 更灵活。

方案二:使用三元运算符

对于较简单的逻辑,可以考虑使用三元运算符,将条件判断和赋值简化为单行语句。

步骤:

  1. 声明 usersID 字符串类型的属性,确保 if 代码块之外可见。
  2. 使用嵌套的三元运算符根据不同的条件直接设置字符串值给变量。

代码示例:

@property (nonatomic, strong) NSString *usersID;

// 获取存储的叶子缩写和主题 ID
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *leafAbbreviation = [defaults objectForKey:[NSString stringWithFormat:@"leafAbbreviation"]];
NSString *themeID = [defaults objectForKey:[NSString stringWithFormat:@"themeId"]];

// 使用三元运算符
NSString *usersID = ([leafAbbreviation isEqualToString:@"new"] && [themeID isEqualToString:@"2"]) ? @"728" : 
                ([leafAbbreviation isEqualToString:@"new"] && [themeID isEqualToString:@"3"]) ? @"275" : @"486";

// API 调用
NSString *path = [NSString stringWithFormat:@"v1/%@/media/?client_id=xxx", usersID];

此方案虽然简洁,但在复杂的条件判断情况下可读性较差。如果逻辑较为复杂,推荐方案一。

安全建议

  • 在实际开发中,应考虑对 leafAbbreviationthemeID 的取值进行更严格的验证,避免使用非预期值导致错误。可以添加默认值,或者根据值来调整 API 的行为。
  • 应采取措施保护 API 调用中的 client_id。 绝不能将 client_id 直接硬编码到客户端应用程序中。建议使用安全的方式从服务器或密钥管理系统中检索,比如环境变量、配置文件或者安全管理服务器获取。

这两个方案可以帮助你解决从 if 语句中获取字符串传递给 API 调用这个问题。应根据实际场景选择最合适的解决方案,并注意确保代码的可读性和安全性。