【Objective-C】OC中的数据类型


本人已经系统地学习过C语言,因此这里仅归纳出OC与C语言中有关数据类型不一样的点。

数据类型

  1. NSLog中,int使用%i来占位,float使用%f来占位,double一般使用%g来占位。
  2. 与C语言一样,对于有限定词修饰的数据类型,如果有long修饰,则占位符也需要添加l;如果有unsigned修饰,则占位符需要添加u
  3. BOOL,OC的布尔类型与C不同,ta使用YESNO来表示。
  4. 字符串对象(NSString),ta是一个OC对象,属于对象数据类型,要用@号修饰,如:NSString* str = @"abcdef",字符串对象要使用%@占位。

以下为基本数据类型的NSLog占位符

类型占位符
char%c
short int%hi、%hx(十六进制)、%ho(八进制)
unsigned short int%hu
int%i、%x、%o
unsigned int%u
long int%li、%lx、%lo
unsigned long int%lu
long long int%lli、%llx、%llo
float%f、%e、%g
double%f、%e、%g
long double%Lf、%Le、%Lg
id%p

对象类型

对象类型值的就是类了,在OC中,class类型变量必须使用指针,表示方式为:

NSString* str;

NSLog中,对象型变量使用%@来占位,不过需要注意的是,要想使用%@占位,在控制台上打印出结果,在类的implementation中需要重写NSObject类description属性的get方法,否则只会显示该对象的地址,如:

#import <Foundation/Foundation.h>  //OC的基础库
#import "ResetNSObject.h"

int main(int agrc, const char* agrv[]) {
    @autoreleasepool {
        ResetNSObject* str = [[ResetNSObject alloc] init];
        NSLog(@"str = %@", str);
    }
    return 0;
}

运行结果如下:

在这里插入图片描述

以下为重写最终父类NSObject:

@implementation Fraction
  
  - (NSString *) description {
  return [NSString stringWithFormat: @"resetNSObjet"];
}
@end

再来看看重写父类后的运行结果:

在这里插入图片描述

id类型

id类型也是表示class的数据类型,当你不知道某个class的具体类名是什么时,就可以使用id来声明class类型的变量,需要注意的是,id默认就是指针,无需使用*声明变量,如:

id graphicObject;

这也是OC不同与C的地方,id是OC实现多态和动态类型、动态绑定的基础。

Calculator类实例分析

根据前面所学,创建一个Caculator类,也可称计算机类,这个类包含加、减、乘、除四则运算。
先声明一个Caculator类,这个类的用法是可以不停地进行运算,所以ta会有一个累计结果,除了加、减、乘、除四个方法外,还有一个clear方法清除之前的运算结果。
声明如下:

#import <Foundation/Foundation.h>

@interface Caculator : NSObject

/// 结果
@property double accumulator;

/// 清除
- (void) clear;

/// 加法
/// - Parameter value: val
- (void) add: (double) value;

/// 减法
/// - Parameter value: val
- (void) subtract: (double) value;

/// 乘法
/// - Parameter value: val
- (void) multiply: (double) value;

/// 除法
/// - Parameter value: val
- (void) divide: (double) value;
@end

实现如下:

#import "Caculator.h"

@implementation Caculator
@synthesize accumulator;

- (void) clear {
    accumulator = 0;
}

- (void) add: (double) value {
    accumulator += value;
}

- (void) subtract: (double) value {
    accumulator -= value;
}

- (void) multiply: (double) value {
    accumulator *= value;
}

- (void) divide: (double) value {
    accumulator /= value;
}
@end

现在来测试一下:

#import <Foundation/Foundation.h>  //OC的基础库
#import "Caculator.h"

int main(int agrc, const char* agrv[]) {
    @autoreleasepool {
        Caculator* cal = [[Caculator alloc] init];
        cal.accumulator = 0;
        
        [cal add: 200.];
        [cal divide: 15.5];
        [cal subtract: 10.3];
        [cal multiply: 5];
        
        NSLog(@"the result is %g", cal.accumulator);
        
        [cal clear];
        [cal add: 5.];
        
        NSLog(@"the result is %g", cal.accumulator);
    }
    return 0;
}

运行结果如下:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值