Oc与c,和swift的基础部分差异
前言
本篇文章的出发点是 C 语言,作为经典的过程式编程语言,它提供了最基本的编程模型:包括输入输出、函数定义、条件与循环、指针操作等
我们将以 C 语言的基本语法结构为“骨架”,逐项展开,比较 Objective-C 和 Swift 这两种现代语言在实现相同功能时的写法与机制差异
换言之,本篇不是简单罗列三种语言的语法形式,而是以 C 语言为基础,探究在其他语言中如何实现相似功能,以及语言设计背后的理念与机制
输出
Hello World
c 语言的 Hello World 程序通常使用标准库中的 printf 函数输出字符串:
#include <stdio.h>
int main () {
printf("Hello World");
return 0;
}
Objective-C 中,引入了 Foundation 框架并使用 NSLog 函数进行输出:
#import <Foundation/Foundation.h>
int main (int argc, const char* argv[]) {
@autoreleasepool {
NSLog(@"Hello World");
}
return 0;
}
Swift 语言则以最简洁的方式调用 print 函数:
import Foundation
print("Hello World")
显然,oc 和 swift 分别使用 #import 和 import 来代替 c 中的 #include。Objective-C 中添加了 @autoreleasepool,这是自动内存释放池,在代码块结束后自动释放对象。@ 符号用于告诉编译器这里使用的是 Objective-C 的高级特性
输出方式方面,Objective-C 使用 NSLog 替代 printf。NSLog 比 printf 更为复杂,默认自动换行并附带时间戳、进程名、进程编号等信息,同时还能输出 OC 对象。Swift 中的 print 也支持自动换行和变量类型自动推断,但不附带额外信息,如:
print("\(name) is \(age) years old.")
输入
在 c 语言中,输入通常使用 scanf 函数实现:
#include <stdio.h>
int main() {
char name[50];
printf("Enter your name: ");
scanf("%s", name);
printf("Hello, %s\n", name);
return 0;
}
Objective-C 完全兼容 c 的输入方式,因此可以直接使用 scanf:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
char name[50];
printf("Enter your name: ");
scanf("%s", name);
NSLog(@"Hello, %s", name);
}
return 0;
}
Swift 则使用 readLine() 函数获取控制台输入,返回值为可选类型(Optional):
import Foundation
print("Enter your name: ", terminator: "")
if let name = readLine() {
print("Hello, \(name)")
}
分支与循环(条件判断)
三种语言的条件判断结构大致相同,主要差异体现在语法风格上。
c 和 oc 使用传统的 for 语法:
for (int i = 0; i < 5; i++) {
printf("%d\n", i);
}
swift 语法更具表现力,使用区间操作符:
for i in 0..<5 {
print(i)
}
swift 的 … 和 …< 分别表示闭区间与半开区间,更符合现代语言的习惯
指针
c 语言中使用指针管理内存和引用变量:
int a = 10;
int* p = &a;
printf("%d", *p);
Objective-C 完全支持 c 的指针语法,但开发中更偏向使用对象和引用方式
同时,通过奇奇怪怪的方式可以让同一个方法名呈现不同的效果(即多态)
函数
C 语言中的函数是典型的过程式风格,函数名称和参数顺序直接决定调用方式。例如:
int add(int a, int b) {
return a + b;
}
调用时直接写为:
int result = add(2, 3);
Objective-C 中函数实质是“方法”,以消息机制为核心,不再直接调用函数名,而是向对象发送“消息”。语法形式如下:
- (int)add:(int)a and:(int)b {
return a + b;
}
调用时为:
int result = [calculator add:2 and:3];
Objective-C 的特点在于函数标签将方法名拆分成多个“单元”,每个参数前都配有“标签”,这种写法提高了代码的可读性。标签名实际上也是方法名的一部分,比如 add:and:
就是该方法的完整名字
这种标签机制可支持更自然的语言表达,比如:
[person setFirstName:@"John" lastName:@"Smith"];
Swift 的函数语法借鉴了 OC 的标签机制,同时进一步优化,使得调用更清晰:
func add(a: Int, b: Int) -> Int {
return a + b
}
默认情况下,Swift 函数第一个参数无外部标签,从第二个参数起需显式标签。也可以手动添加或移除标签:
func add(_ a: Int, to b: Int) -> Int {
return a + b
}
let result = add(2, to: 3)
总结来说,C 的函数是过程式的、基于位置匹配;OC 的方法以消息机制为基础,强调语义化标签;Swift 则融合两者优点,既支持清晰调用,也保证类型安全
面向对象与面向过程(c 与 oc)
C 是一种过程式编程语言,它的核心在于“以过程为中心”,程序是由一个个函数组成,数据在函数之间传递。
程序设计的关键是函数的封装、复用与组织,控制权掌握在程序设计者手中。
数据是被动的、无行为的实体。
Objective-C 是面向对象的编程语言,它强调“以对象为中心”,数据和操作被统一为对象,程序由对象之间的消息传递驱动运行。
每个对象封装自己的状态和行为,对象之间通过消息传递互动,程序控制流由对象行为决定。
面向对象的核心特性是封装、继承与多态,从而实现高内聚、低耦合。
从结构上看,C 强调数据与函数的分离;而 Objective-C 将数据与操作绑定在一起构成类,从而实现更清晰、更易扩展的程序结构。
从语义层面看,C 更偏向于“怎么做”,而 Objective-C 更偏向于“谁去做”。
因此,二者在设计理念、程序组织方式以及语言机制上存在根本区别。
Objective-C 通过 @interface 与 @implementation 定义类和方法,所有对象均继承自 NSObject,实例化通过 alloc/init 完成。
语言机制的不同也意味着两者适用的编程范式和解决问题的方式有本质区别。