MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Objective-C条件语句(if-else、switch)使用技巧

2023-08-173.8k 阅读

Objective-C 条件语句(if - else、switch)使用技巧

if - else 语句基础

在 Objective - C 中,if - else语句是最基本的条件控制结构,用于根据条件的真假来执行不同的代码块。其基本语法如下:

if (condition) {
    // 如果条件为真,执行这里的代码
} else {
    // 如果条件为假,执行这里的代码
}

其中,condition是一个布尔表达式,它的结果要么为YES(真),要么为NO(假)。例如,我们来判断一个整数是否大于 10:

int number = 15;
if (number > 10) {
    NSLog(@"这个数字大于 10");
} else {
    NSLog(@"这个数字小于或等于 10");
}

在上述代码中,number > 10就是条件表达式。由于number的值为 15,大于 10,所以条件为真,会输出“这个数字大于 10”。

if - else 语句的嵌套

if - else语句可以嵌套使用,以处理更复杂的条件逻辑。语法如下:

if (condition1) {
    // 如果 condition1 为真,执行这里
    if (condition2) {
        // 如果 condition2 也为真,执行这里
    } else {
        // 如果 condition2 为假,执行这里
    }
} else {
    // 如果 condition1 为假,执行这里
}

假设我们要判断一个学生的成绩等级。成绩大于等于 90 分为 A,80 - 89 分为 B,60 - 79 分为 C,小于 60 分为 D。代码如下:

int score = 85;
if (score >= 60) {
    if (score >= 80) {
        if (score >= 90) {
            NSLog(@"成绩等级为 A");
        } else {
            NSLog(@"成绩等级为 B");
        }
    } else {
        NSLog(@"成绩等级为 C");
    }
} else {
    NSLog(@"成绩等级为 D");
}

在这个例子中,通过层层嵌套的if - else语句,根据不同的成绩范围输出相应的等级。虽然嵌套的if - else语句能解决复杂的条件判断,但过多的嵌套会使代码可读性变差,增加维护成本。

简化 if - else 语句

  1. 使用三元运算符 三元运算符?:可以在某些情况下简化if - else语句。其语法为:condition? expression1 : expression2。如果condition为真,返回expression1的值;否则,返回expression2的值。

例如,我们要获取两个数中的较大值,原本使用if - else语句可以这样写:

int a = 10;
int b = 20;
int max;
if (a > b) {
    max = a;
} else {
    max = b;
}
NSLog(@"较大值为 %d", max);

使用三元运算符可以简化为:

int a = 10;
int b = 20;
int max = (a > b)? a : b;
NSLog(@"较大值为 %d", max);
  1. 提前返回 在一些函数或方法中,如果满足某些条件就直接返回,可以减少if - else的嵌套层次,使代码更清晰。

例如,我们有一个函数用于计算两个正整数的商,如果除数为 0 则返回 -1。通常的写法可能是:

float divide(int a, int b) {
    if (b!= 0) {
        return (float)a / b;
    } else {
        return -1;
    }
}

通过提前返回,可以简化为:

float divide(int a, int b) {
    if (b == 0) {
        return -1;
    }
    return (float)a / b;
}

复合条件判断

if - else语句中的条件可以是复合条件,通过逻辑运算符&&(与)、||(或)和!(非)将多个简单条件组合起来。

  1. 逻辑与(&&) 只有当所有条件都为真时,复合条件才为真。例如,判断一个数是否在 10 到 20 之间(包括 10 和 20):
int number = 15;
if (number >= 10 && number <= 20) {
    NSLog(@"这个数在 10 到 20 之间");
} else {
    NSLog(@"这个数不在 10 到 20 之间");
}
  1. 逻辑或(||) 只要有一个条件为真,复合条件就为真。比如,判断一个人是否是成年人(年龄大于等于 18 岁)或者是儿童(年龄小于 10 岁):
int age = 25;
if (age >= 18 || age < 10) {
    NSLog(@"是成年人或者儿童");
} else {
    NSLog(@"既不是成年人也不是儿童");
}
  1. 逻辑非(!) 用于取反条件的真假。例如,判断一个数是否不为 0:
int number = 5;
if (!(number == 0)) {
    NSLog(@"这个数不为 0");
} else {
    NSLog(@"这个数为 0");
}

switch 语句基础

switch语句是另一种条件控制结构,用于根据一个表达式的值来选择执行不同的分支。其基本语法如下:

switch (expression) {
    case value1:
        // 如果 expression 的值等于 value1,执行这里的代码
        break;
    case value2:
        // 如果 expression 的值等于 value2,执行这里的代码
        break;
    default:
        // 如果 expression 的值不等于任何一个 case 的值,执行这里的代码
        break;
}

expression通常是一个整数类型(包括char)的表达式,value1value2等是与expression类型相同的常量值。break语句用于结束当前case分支的执行,防止代码继续执行下一个case分支。

例如,根据一个表示星期几的整数(1 - 7)输出对应的星期名称:

int day = 3;
switch (day) {
    case 1:
        NSLog(@"星期一");
        break;
    case 2:
        NSLog(@"星期二");
        break;
    case 3:
        NSLog(@"星期三");
        break;
    case 4:
        NSLog(@"星期四");
        break;
    case 5:
        NSLog(@"星期五");
        break;
    case 6:
        NSLog(@"星期六");
        break;
    case 7:
        NSLog(@"星期日");
        break;
    default:
        NSLog(@"无效的数字");
        break;
}

在上述代码中,day的值为 3,所以会输出“星期三”。

switch 语句的注意事项

  1. 常量表达式 case后面的值必须是常量表达式,不能是变量或带有变量的表达式。例如,下面的代码是错误的:
int value = 10;
switch (value) {
    case value: // 错误,不能是变量
        NSLog(@"值为 10");
        break;
    default:
        break;
}
  1. fall - through 如果在case分支中没有使用break语句,代码会继续执行下一个case分支,这种现象称为“fall - through”。例如:
int number = 2;
switch (number) {
    case 1:
        NSLog(@"数字为 1");
    case 2:
        NSLog(@"数字为 2");
    case 3:
        NSLog(@"数字为 3");
        break;
    default:
        break;
}

由于number的值为 2,首先会执行case 2的代码,输出“数字为 2”。因为没有break语句,代码会继续执行case 3的代码,输出“数字为 3”。在实际编程中,通常要避免意外的“fall - through”,除非有特定的逻辑需求。

  1. default 分支 default分支不是必需的,但在不确定expression可能取值的情况下,使用default分支可以处理意外情况。例如,在处理用户输入的数字时,如果输入了一个不在预期范围内的数字,default分支可以给出相应的提示。

switch 与 if - else 的选择

  1. 简单条件判断 对于简单的二选一条件判断,if - else语句更加直观和简洁。例如,判断一个数是否为正数:
int number = 5;
if (number > 0) {
    NSLog(@"这个数是正数");
} else {
    NSLog(@"这个数不是正数");
}
  1. 多分支判断 当需要根据一个变量的多个不同值执行不同操作时,如果值是离散的且数量有限,switch语句可能更合适,因为它的代码结构更清晰,执行效率也可能更高。比如,根据不同的用户角色(用整数表示)执行不同的操作:
int userRole = 2;
switch (userRole) {
    case 1:
        // 管理员操作
        NSLog(@"执行管理员操作");
        break;
    case 2:
        // 普通用户操作
        NSLog(@"执行普通用户操作");
        break;
    case 3:
        // 访客操作
        NSLog(@"执行访客操作");
        break;
    default:
        NSLog(@"无效的用户角色");
        break;
}

然而,如果条件判断涉及范围比较或者复杂的逻辑运算,if - else语句会更灵活。例如,判断一个数是否在某个区间内,或者根据多个条件的组合进行判断。

结合枚举使用 switch

在 Objective - C 中,枚举类型常与switch语句结合使用,使代码更具可读性和可维护性。枚举类型定义一组命名的整数值。

例如,定义一个表示季节的枚举类型,并使用switch语句根据季节输出相应的信息:

typedef NS_ENUM(NSInteger, Season) {
    SeasonSpring,
    SeasonSummer,
    SeasonAutumn,
    SeasonWinter
};

Season currentSeason = SeasonSummer;
switch (currentSeason) {
    case SeasonSpring:
        NSLog(@"春天到了,万物复苏");
        break;
    case SeasonSummer:
        NSLog(@"夏天到了,天气炎热");
        break;
    case SeasonAutumn:
        NSLog(@"秋天到了,果实累累");
        break;
    case SeasonWinter:
        NSLog(@"冬天到了,白雪皑皑");
        break;
    default:
        break;
}

通过这种方式,代码中使用枚举值代替具体的整数,使代码更易读,并且如果需要修改枚举值的含义或添加新的枚举值,只需要在枚举定义处修改,而不需要在switch语句中逐一修改。

优化条件语句的性能

  1. 减少不必要的计算 在条件表达式中,尽量避免重复计算或执行复杂的函数调用。例如,如果一个复杂函数的返回值在条件判断中多次使用,可以先将其结果存储在一个变量中。
// 不推荐的写法
if (expensiveFunction() > 10 && expensiveFunction() < 20) {
    // 执行代码
}

// 推荐的写法
int result = expensiveFunction();
if (result > 10 && result < 20) {
    // 执行代码
}
  1. 合理安排条件顺序 对于复合条件,将更有可能为假的条件放在前面。因为逻辑与(&&)和逻辑或(||)运算符具有短路特性,即一旦确定整个表达式的真假,就不会再计算后面的条件。

例如,对于if (condition1 && condition2),如果condition1为假,就不会再计算condition2。所以,如果condition1更有可能为假,就把它放在前面,这样可以减少不必要的计算。

  1. 使用高效的数据结构辅助判断 在某些情况下,如果需要频繁地根据某个值进行条件判断,可以使用更高效的数据结构。例如,如果需要根据大量的整数值进行快速判断,可以考虑使用哈希表。虽然 Objective - C 本身没有内置的哈希表类型,但可以使用NSDictionary来模拟。

假设我们要快速判断一个整数是否在一组特定的整数集合中,使用NSDictionary可以这样实现:

NSMutableDictionary *numberSet = [NSMutableDictionary dictionary];
NSArray *numbers = @[@1, @2, @3, @4, @5];
for (NSNumber *number in numbers) {
    [numberSet setObject:@YES forKey:number];
}

int checkNumber = 3;
if ([numberSet objectForKey:@(checkNumber)]) {
    NSLog(@"数字 %d 在集合中", checkNumber);
} else {
    NSLog(@"数字 %d 不在集合中", checkNumber);
}

相比使用if - else语句逐一判断,这种方法的查找效率更高,尤其是当集合中的元素数量较多时。

条件语句中的类型转换

在条件语句中,要注意类型转换可能带来的影响。例如,当一个浮点数与整数进行比较时,可能会因为精度问题导致结果不符合预期。

float floatNumber = 10.000001f;
int intNumber = 10;
if (floatNumber == intNumber) {
    NSLog(@"相等");
} else {
    NSLog(@"不相等");
}

在上述代码中,由于浮点数的精度问题,floatNumber实际上可能略大于 10,所以比较结果可能为不相等,即使我们期望它们相等。为了避免这种情况,可以设置一个允许的误差范围进行比较。

float floatNumber = 10.000001f;
int intNumber = 10;
float epsilon = 0.00001f;
if (fabs(floatNumber - intNumber) < epsilon) {
    NSLog(@"相等");
} else {
    NSLog(@"不相等");
}

另外,当使用逻辑运算符连接不同类型的条件时,也要注意类型的隐式转换。例如,在if (condition1 && condition2)中,如果condition1是一个整数表达式,condition2是一个布尔表达式,condition1会被隐式转换为布尔值。非零整数会被转换为YES,零会被转换为NO

条件语句与代码可读性

  1. 添加注释 对于复杂的条件语句,尤其是嵌套的if - else语句或包含复杂逻辑的复合条件,添加注释可以帮助其他开发者(甚至自己在一段时间后)理解代码的逻辑。
// 判断用户是否是管理员且年龄大于 18 岁
if (user.role == UserRoleAdmin && user.age > 18) {
    // 执行管理员操作
} else {
    // 执行普通操作
}
  1. 提取条件逻辑 如果条件表达式非常复杂,可以将其提取到一个单独的函数或方法中,并给这个函数取一个有意义的名字,这样可以使if - else语句的逻辑更清晰。
BOOL isEligibleForDiscount(User *user) {
    return user.purchaseAmount > 100 && user.membershipLevel >= 2 && user.isActive;
}

if (isEligibleForDiscount(currentUser)) {
    // 给予折扣
} else {
    // 不给予折扣
}
  1. 使用代码格式化工具 合理使用代码格式化工具可以使条件语句的结构更清晰。例如,Xcode 提供了自动格式化代码的功能,可以正确地缩进if - else语句的代码块,使其层次结构一目了然。

通过以上对 Objective - C 中if - elseswitch条件语句的详细介绍,包括它们的基础用法、使用技巧、性能优化以及与代码可读性的关系,希望开发者在编写代码时能够更加灵活、高效地运用这些条件语句,编写出更健壮、易读的程序。在实际编程中,要根据具体的需求和场景,选择合适的条件控制结构,并不断优化代码,以提高程序的质量和性能。同时,注意条件语句中的细节,如类型转换、避免不必要的计算等,这些都有助于提升整个项目的稳定性和效率。无论是简单的二选一判断,还是复杂的多分支逻辑,熟练掌握条件语句的使用技巧是成为优秀 Objective - C 开发者的重要一步。