1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | 条件语句 推荐写法,加上括号 if (!error) { return success; } 不推荐写法 if (!error) return success; 表达式 推荐写法 if ([myValue isEqual:@42]) { ... 不推荐写法 if ([@42 isEqual:myValue]) { ... nil和 bool 检查 推荐写法 if (someObject) { ... if (![someObject boolValue]) { ... if (!someObject) { ... 不推荐写法 if (someObject == YES) { ... // Wrong if (myRawValue == YES) { ... // Never do this. if ([someObject boolValue] == NO) { ... 方法中重要的部分不要嵌套在分支里面 推荐写法 如果条件不满足,就退出,如果条件满足,就继续执行方法内的代码,这些代码没有在条件分支里面,而是在条件分支外面 - ( void )someMethod { if (![someOther boolValue]) { return ; } //Do something important } 不推荐写法 下面的写法我经常使用,就是判断某条件满足,然后执行条件中的代码,应该好的做法是像上面一样 - ( void )someMethod { if ([someOther boolValue]) { //Do something important } } 复杂表达式 推荐做法 当你有一个复杂的 if 子句的时候,你应该把它们提取出来赋给一个 BOOL 变量,这样可以让逻辑更清楚,而且让每个子句的意义体现出来。 BOOL nameContainsSwift = [sessionName containsString: @"Swift" ]; BOOL isCurrentYear = [sessionDateCompontents year] == 2014; BOOL isSwiftSession = nameContainsSwift && isCurrentYear; if (isSwiftSession) { // Do something very cool } 三元运算符 推荐写法 result = a > b ? x : y; 不推荐写法 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解 result = a > b ? x = c > d ? c : d : y; 情况2:当三元运算符的第二个参数( if 分支)返回和条件语句中已经检查的对象一样的对象的时候 推荐写法 result = object ? : [self createObject]; // 就是后面不写多一次object 不推荐写法 result = object ? object : [self createObject]; 错误处理 推荐写法 有些方法通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用。 NSError *error = nil; if (![self trySomethingWithError:&error]) { // Handle Error } Case语句 - 除非编译器强制要求,括号在 case 语句里面是不必要的。但是当一个 case 包含了多行语句的时候,需要加上括号。 - 使用 fall-through 在不同的 case 里面执行同一段代码。一个 fall-through 是指移除 case 语句的 “ break ” 然后让下面的 case 继续执行。 - 当在 switch 语句里面使用一个可枚举的变量的时候, default 是不必要的 - 当使用 enum 的时候,建议使用新的固定的基础类型定义,因为它有更强大的类型检查和代码补全。 SDK 现在有一个 宏来鼓励和促进使用固定类型定义 - NS_ENUM() - 为了避免使用默认的 case ,如果新的值加入到 enum ,程序员会马上收到一个 warning 通知 // 一个case有多行语句,加上括号 switch (condition) { case 1: // ... break ; case 2: { // ... // Multi-line example using braces break ; } case 3: // ... break ; default : // ... break ; } // fall-through,就是执行case1继续执行下面的case,不停止 switch (condition) { case 1: case 2: // code executed for values 1 and 2 break ; default : // ... break ; } // 不使用default switch (menuType) { case ZOCEnumNone: // ... break ; case ZOCEnumValue1: // ... break ; case ZOCEnumValue2: // ... break ; } // warning通知 Enumeration value 'ZOCEnumValue3' not handled in switch .(枚举类型 'ZOCEnumValue3' 没有被 switch 处理) // 使用NS_ENUM() typedef NS_ENUM(NSUInteger, ZOCMachineState) { ZOCMachineStateNone, ZOCMachineStateIdle, ZOCMachineStateRunning, ZOCMachineStatePaused }; |
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 感觉程序员要被 AI 淘汰了?学什么才有机会?
· MQTT协议发布和订阅的实现,一步步带你实现发布订阅服务。
· Dify开发必备:分享8个官方文档不曾解释的关键技巧
· 活动中台系统慢 SQL 治理实践
· “你觉得客户需要”是杀死TA的最后一根稻草 | IPD集成产品开发