Swift 和 Objective-C 的几个易混淆点

Swift和Objective-C语法并不太相似,但是有些从C继承的东西是类似的,比如块注释、switch语句等,但是看起来一样的地方,也有些细微的不同,如果依照C的思路就容易出错,下面列举几点:

因为Objective-C是C的扩展,对于C支持的特性,本文以C语言举例。

易混淆点一:块注释

C语言的块注释是不能嵌套的,Swift的块注释可以嵌套。

// C 代码
/* C语言最初只支持块注释 /* */,后来C99标准增加了行注释 //
*/
int main() { return 0; }

上面的代码是编译不过的,因为注释到了逗号前就结束了。

Swift注释支持嵌套,下面的代码是正确的

// Swift 代码
/* Swift语言支持块注释 /* */ 和行注释 //
 */
print("Hello, World!")

易混淆点二:switch语句

C的case语句是下坠的,Swift不下坠,Swift的case支持多值。
判断元音的函数

// C 代码
bool isVowelLetter(char ch) {
    bool result = false;
    switch (toupper(ch)) {
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
            result = true;
            break;
        default:
            result = no;
    }
    return result;
}

Swift 需要下坠需要使用fallthrough关键字,上面逻辑Swift的等效代码为:

func isVowelLetter(char ch: Character) -> Bool {
    var result: Bool
    switch String(ch).uppercased() {
    case "A":
        fallthrough
    case "E":
        fallthrough
    case "I":
        fallthrough
    case "O":
        fallthrough
    case "U":
        print("\(ch)是元音字母")
        result = true
        // break        这里不需要break
    default:
        print("\(ch)不是元音字母")
        result = false
    }
    return result
}

不过Swift的case语句可以支持多个值,上面代码可简化为:

func isVowelLetter(char ch: Character) -> Bool {
    var result: Bool
    switch String(ch).uppercased() {
    case "A", "E", "I", "O", "U":
        print("\(ch)是元音字母")
        result = true
    default:
        print("\(ch)不是元音字母")
        result = false
    }
    return result
}

易混淆点三:移位运算

C语言的移位是逻辑移位还是算术移位和编译器实现相关,Swift的移位是算术移位。

推荐阅读更多精彩内容