接上文
我们还是结合之前分数的示例来说明,只是更为详尽。使用XCode创建新的项目Fraction,然后创建Fraction类,此时XCode为我们生成两个文件:Fraction.h和Fraction.m。我们在Fraction.h这个头文件中定义分数类Fraction,在Fraction.m中编写分数类的实现代码,在main.m中编写测试程序。那么在XCode中我们得到如下的项目结构:
来看下头文件中的类定义:
//
// Fraction.h
// Fraction
//
// Created by Nan Lei on 13-1-1.
// Copyright (c) 2013年 Nan Lei. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
-(void) print;
-(void) setNumerator: (int) n;
-(void) setDenominator: (int) d;
-(int) numerator;
-(int) denominator;
-(double) convertToNum;
@end
这里的头文件也可以叫做接口文件,它会告知编译器Fraction类的特征,就是包含六个实例方法(用"-"定义的方法)。Fraction类的实现会编写在Fraction.m文件中,代码如下:
//
// Fraction.m
// Fraction
//
// Created by Nan Lei on 13-1-1.
// Copyright (c) 2013年 Nan Lei. All rights reserved.
//
#import "Fraction.h"
@implementation Fraction
{
int numerator;
int denominator;
}
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(void) setNumerator:(int)n
{
numerator=n;
}
-(void) setDenominator:(int)d
{
denominator=d;
}
-(int) numerator
{
return numerator;
}
-(int) denominator
{
return denominator;
}
-(double) convertToNum
{
if(denominator!=0){
return (double)numerator/denominator;
}else{
return NAN;
}
}
@end
这和我们之前示例中的是一样的,这里注意一点import语句,我们使用双引号("")来导入头文件,而不是尖括号(<>),原因是Fraction.h是我们自定义的头文件,而不是系统提供的。这样编译器就知道该从什么地方来找到指定的头文件,当然,如果有必要,可以使用更为详细的路径(当我们在不同包下定义了相同的类名的类时)来查找不同位置。
最后来看main.m文件,这是我们之前没有做的一个文件,此时我们拆分main函数到main.m文件中,代码如下:
//
// main.m
// Fraction
//
// Created by Nan Lei on 13-1-1.
// Copyright (c) 2013年 Nan Lei. All rights reserved.
//
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *fractionA = [Fraction new];
Fraction *fractionB = [Fraction new];
[fractionA setNumerator:1];
[fractionA setDenominator:3];
NSLog(@"The value of fractionA is %g",[fractionA convertToNum]);
NSLog(@"fractionB is %i / %i",fractionB.numerator,fractionB.denominator);
NSLog(@"The value of fractionB is %g",[fractionB convertToNum]);
}
return 0;
}
要注意这里的import语句,我们仍然引入的是头文件,而不是实现文件。也就是我们只需获取类定义部分的信息就可以了,系统处理时会为我们寻找实现的方法。
这样的代码结构对于之前看到的简单示例来说就复杂多了,这是我们扩大程序规模的必经之路,也更为实用。
我们在上述代码中的Fraction实现文件中编写了两个属性numerator和denominator,并且提供了设置值和取值的方法(类似Java的getter和setter方法),其实更好的写法是在接口文件中使用@property指令来定义属性,还可以省略掉设置值和取值的方法(系统会自动为我们实现),那么Fraction.h的代码修改如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
@end
这样一来,代码就简单很多,那么在实现文件Fraction.m中使用@synthesize指令即可完成对属性numerator和denominator的设置值和取值操作:
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(double) convertToNum
{
if(denominator!=0){
return (double)numerator/denominator;
}else{
return NAN;
}
}
@end
在XCode中运行代码,我们就得到如下的结果:
说明我们的代码是正确的。
我们使用了@property指令,就不用在实现部分定义相应的实例变量,使用@synthesize指令就会告诉编译器为我们生成设置值和取值的方法。方法命名规范是设置值方法setX(x是我们的变量名),注意大小写(和Java Bean的访问器方法类似),取值方法名就是变量名x。当然我们也可以使用点运算符来访问属性,比如我们代码中的写法。同时使用点运算符来为属性赋值也是可以的,只是在代码中没有体现出来。
比如
instance.property=value等价于
[instance setProperty: value],比如
instance.property等价于
[instance property]的写法。
之前的代码中我们的方法参数都为一个,下面来看看带有多个参数的方法该如何定义和使用。我们继续来改写分数类Fraction,提供一个可以同时设置分子和分母的方法,很容易想到如下语句
[fractionA setNumerator:1 setDenominator:3],这是我们很容易想到的方式,但是该方式不具备一个易于理解的方法名,其实我们可以这样来定义这个方法:
-(void) setTo: (int) n over: (int) d;
下面修改头文件的定义,代码如下:
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
@property int numerator,denominator;
-(void) print;
-(double) convertToNum;
-(void) setTo:(int) n over: (int) d;
@end
这里我们加入了这个方法的定义,那么实现该方法,代码如下:
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
NSLog(@"%i/%i",numerator,denominator);
}
-(double) convertToNum
{
if(denominator!=0){
return (double)numerator/denominator;
}else{
return NAN;
}
}
-(void) setTo:(int)n over:(int)d
{
numerator=n;
denominator=d;
}
@end
最后修改主函数来进行测试:
#import "Fraction.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Fraction *fractionA = [Fraction new];
Fraction *fractionB = [Fraction new];
[fractionA setTo:10 over:406];
[fractionB setTo:23 over:901];
[fractionA print];
[fractionB print];
}
return 0;
}
编译运行,我们得到如下的结果:
带有多个参数的方法在定义时,参数名称是可选的,比如上面的方法我们还可以定义为如下形式:-(int) set: (int) n: (int) d;显然这里没有对第二个参数命名,那么调用该方法时,我们可以这样做[fractionA set: 10: 406],虽然可以这么做,但是省略参数名的做法是不推荐的,因为可能会引起语义不清等问题。如果参数很多或者参数很重要,可能就会引起大问题。
接下文
- 大小: 20.9 KB
- 大小: 82.7 KB
- 大小: 61.1 KB
分享到:
相关推荐
8. **类的结构**:一个Objective-C类通常包含接口(.h文件)和实现(.m文件)。接口文件声明实例变量和公共方法,实现文件包含实际的代码实现,并可能包含私有方法。 9. **方法命名**:Objective-C方法名通常省略...
这篇“Objective-C学习笔记”旨在帮助初学者理解并掌握这种强大的编程工具。 一、Objective-C基础 1. 类与对象:Objective-C中的所有操作都是基于类的,类是对象的模板,而对象是类的实例。理解类和对象的概念是...
根据给定的学习笔记,我们将从以下几个方面深入探讨Objective-C的基础语法: 1. **基本概念介绍**:包括类、对象、方法等基本概念。 2. **Objective-C核心类型**:如`NSString`、`NSArray`、`NSDictionary`。 3. **...
Objective-C 是一种面向对象的编程语言,起源于20世纪80年代,由Bard Cox发明,后来在NeXTSTEP操作系统中得到广泛应用。NeXT公司由Steve Jobs创立,并在1996年被苹果公司收购,Objective-C也随之成为苹果操作系统的...
这篇笔记主要介绍了Objective-C的一些基础知识,包括以下几个方面: 1. Objective-C概述,介绍了Objective-C的来源、发展历史和作为面向对象的C语言的特点。 2. 第一个OC程序,讲解了如何创建一个OC项目,解释了一些OC...
这份“Objective-C学习资料”包含了内置的学习笔记和各内容源码,是作者在近两个月的学习过程中整理出来的成果,旨在为初学者提供有价值的指导。 首先,让我们深入了解一下Objective-C的基本概念。Objective-C是在...
Objective-C中定义一个类通常包括两个文件:头文件(`.h`)和实现文件(`.m`)。头文件包含了类的接口声明,而实现文件包含了类的方法实现。 - **头文件**:定义了类的公共接口,其他类可以通过这个接口来访问这个...
Objective-C是一种面向对象的编程语言,它在C语言的基础上增加了SmallTalk-80的特性,主要应用于Apple的iOS和macOS平台。Objective-C中的UIKit框架是构建用户界面的基础,提供了丰富的控件和功能来创建iOS应用程序。...
**Objective-C**是一种面向对象的编程语言,它在C语言的基础上增加了面向对象的功能,并且是开发iOS应用的主要语言之一。尽管Swift已经成为苹果官方推荐的新一代编程语言,但Objective-C仍然拥有大量的代码库和丰富...
Objective-C是一种基于C语言的面向对象编程语言,主要应用于Apple的macOS和iOS操作系统。它是开发Mac应用程序的基础,对于想要进入苹果平台开发的程序员来说,学习Objective-C是必不可少的步骤。本资源包为初学者...
Objective-C是一种简单的...Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。
Objective-C是在C语言的基础上扩展的,增加了Smalltalk式的面向对象特性,使得它在编写复杂应用程序时具有更高的灵活性和可扩展性。 Objective-C的核心概念主要包括类、对象、消息传递和协议。以下是对这些概念的...
Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,使得面向对象编程更加灵活...
类是Objective-C中的基本构建块,它定义了一组相关的属性(数据)和方法(行为)。你可以通过继承来创建新的类,从而复用现有类的属性和方法。Objective-C支持多继承,但通常建议使用协议(Protocols)来实现类似的...
这篇学习笔记主要涉及了Objective-C的基础知识,包括对象创建、类的结构、文件导入、实例变量、接口与实现、内存管理和属性。 1. **对象创建**: - `string`方法创建的字符串对象是自动释放的,意味着系统会在适当...
Objective-C 的核心概念之一是类(Class)。类的定义通常包含两个文件:头文件(.h)和源文件(.m)。头文件用于声明类的接口,包括其属性(成员变量)和方法,而源文件则实现这些接口。这与 C++ 的组织方式类似,...
Objective-C 是苹果平台下开发 iOS 和 macOS 应用的主要编程语言之一,虽然 Swift 已经成为新宠,但Objective-C 的重要性仍然不可忽视,尤其是因为许多现有的类库和框架仍由 Objective-C 编写。以下是一份关于...
首先,Objective-C是Apple公司基于C语言构建的一种面向对象的编程语言,它在C语言的基础上添加了Smalltalk风格的消息传递机制,以及一些类和对象的概念。Objective-C是iOS和macOS应用开发的首选语言,其强大的特性...