大前言
- 本文适合能熟练使用c#的开发者。
前言
- Hello,大家好!这里是辉仔,最近我在学习ios的开发,所以也就自然而然地接触到了objective-c(以下简称objc),由于我之前是做unity开发的,所以我最经常使用的语言是c#,所以这系列的文章我会以我对c#的理解去取出objective-c与c#的相似之处并快速上手objc。并以一个简单的控制台程序作为讲解。
先来看看两者的语言外貌
以下是我写的两个简单控制台程序的main方法内容,一个用c#写,一个用objc写,并且两个程序的作用是完全一样的。
c#版本
static void Main(string[] args)
{
person huizai = new person("辉仔",18);//实例化一个叫辉仔的对象
person lisi = new person("李四", 20);//实例化一个叫李四的对象
person.staticfunction();//静态方法调用
huizai.function();//调用实例化方法
huizai.functionWithOneParameter(450);//调用带有一个参数实例化方法,传入450这个参数
huizai.functionWithTwoParameter(12, 450);//调用带有二个参数实例化方法,传入12和450两个参数
huizai.delegateObject = new person.DesignatedDriving(lisi.designatedDriving);//将huizai对象中的委托对象与方法关联起来
huizai.delegateObject(huizai);//调用委托的方法
huizai.Driveacar();//调用接口方法
Console.ReadKey();
}
- objc版本
int main(int argc, const char * argv[])
{
person *huizai=[[person alloc] initWithname:@"辉仔" age:18];//实例化一个叫辉仔的对象
person *lisi=[[person alloc]initWithname:@"李四" age:20];//实例化一个叫李四的对象
[person staticFunction];//静态方法调用
[huizai function];//调用实例化方法
[huizai functionWithFistParameter:450];//调用带有一个参数实例化方法,传入450这个参数
[huizai functionWithFistParameter:12 SecondParameter:450];//调用带有二个参数实例化方法,传入12和450两个参数
huizai.delegate=lisi;//确定委托对象
[huizai designatedDriving:lisi];//调用委托方法
[huizai usecategoryfunction];//调用category拓展方法
return 0;
}
- c#输出结果
- objc输出结果
- 可以看到输出的结果除了接口那块其他都是一样的,当然这里我只展示了main方法,而且输出内容是我控制,即使结构不一样我也可以让他输出一样的结果,不过我这样做也没任何的意义。回归正题,这里你们可以一行一行对比,发现其实做的事基本都是一样的,但熟悉c#的开发者可能会觉objc的语法很诡异,和平常的java,c++都不同,确实是这样,ojbc就是长这样的,但其实只要学习他的语法后就会发现objc再怎么说都只是一门面向对象的编程语言,基本的思想是不会变的,所以掌握c#的开发者是很好上手的。
今天就先来说说objc和c#类文件的不同
- 在c#中创建一个类只需创建一个.class文件,甚至在同一文件里可以创建多个类,但在在objc中一个类他包含两个文件,一个.h文件,一个.m文件,如果你学过c++,那么你应该对这很熟悉,而且我可以告诉你objc的.h.m文件和c++中的.h.m文件作用是一样的,.h文件就是用来声明属性,变量,和方法的,.m文件就是用来实现方法的,当然在objc中这两个文件还有更多的作用,这里先不作过多的叙述。
- objc中的.h和.m文件
- 在c#中创建一个变量和方法只需写一遍即可,就像下面这样
class xxx
{
int xxx=35435;//创建一个变量并赋值
void xxx()//创建一个方法并实现里面的内容
{
Console.WriteLine("XXX");
}
}
但在objc中就没这么方便了,首先我们要在.h文件里声明
//这里是xxx类的.h文件xxx.h
#import <Foundation/Foundation.h>//这里就先理解成引用或预处理就好
/**objc中每个类必须继承NSobject类,不过其实系统会自动帮你写好*/
@interface xxx: NSObject
int xxx;//声明了一个xxx的int变量,这里不能赋值
-(void) xxx;//这里声明了一个xxx方法,这里不能实现方法内容
@end//在@interface和@end之间作声明
然后再在.m文件实现
//这里是xxx类的.m文件xxx.m
#import "person.h" //必须要引进自己类的.h文件,不过其实系统会自动帮你写好
@implementation xxx
-(void) xxx//实现方法内容
{
self.xxx=34234;// 对自身的xxx变量赋值
NSLog(@"xxx");
}
@end
对比一下我相信懂c#的程序员应该可以看明白,但注意以下几点:
- 在.h文件的interface和@end之间作声明,并且不对声明对象进行赋值或实现。
- 在.m文件的implementation和@end之间作实现或赋值。
- 类中的方法一旦在.h文件声明了,必须在.m文件作实现。
- 方法和变量不一定要在.h文件声明,可以在.m文件实现一个未声明的方法,也可以在.m文件的方法里实现一个临时变量,并且这些方法能被类自身内部调用,但不能作为类的实例化方法(有点类似c#类中的private方法)。
结语
- 相信大家已经对objc的类有了一定的了解,下次我会讲讲变量和属性,我们下次见吧!