iOS之包装类、description方法、==或isEqual

前言

Objective- C提供了NSValue、NSNumber来封装c语言的基本类型,这样就可以让他们具有面向对象的特征

三个类型

  • NSInteger:大致等于long型整数
  • NSUInteger:大致等于unsigned long 型整数
  • CGFLoat:大致相当于double( 在64位系统),float(在32位系统)
    注意:它们是基本类型不是包装类。在定义整形变量时建议使用NSInteger,NSUInteger,定义浮点型变量时建议使用CGFLoat

包装类

NSValue 和 NSNumber

1、相同点
NSValue 和 NSNumber都是包装类,NSValue 是 NSNumber的父类
2、区别
NSValue:代表一个更通用的包装类,可用于包装单个short、int、long、float、char、指针、对象id等数据项
NSNumbe:是更具体的包装类,用于包装c语言的各种数值类型
NSNumber 方法 :

  • + numberWithXxx : : 将特定类型的值包装成 NSNumber;
  • - initWithXxx : :先创建一个 NSNumber 对象, 再用一个基本类型的值来初始化 NSNumber;
  • - xxxValue : : 返回 NSNumber 对象包装的基本类型的值;

在这里插入图片描述

包装类代码示例

#import <Foundation/Foundation.h>
 
int main(int argc, char * argv[]) {
	@autoreleasepool {
		NSNumber * num_int = [NSNumber numberWithInt : 10];
		NSNumber * num_double = [NSNumber numberWithDouble : 10];
		NSNumber * num_char = [NSNumber numberWithChar : 'A'];
 
		NSLog(@"number_int : %d, number_double : %g, num_char : %c",
			[num_int intValue], [num_double doubleValue], [num_char charValue]);
 
		NSNumber * num_int1 = [[NSNumber alloc] initWithInt : 10];
		NSNumber * num_double1 = [[NSNumber alloc] initWithDouble : 10];
		NSNumber * num_char1 = [[NSNumber alloc] initWithChar : 'A'];
 
		NSLog(@"number_int1 : %d, number_double1 : %g, num_char1 : %c",
			[num_int1 intValue], [num_double1 doubleValue], [num_char1 charValue]);
	}
}

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

description 方法

1.description 方法简介

是一个“自我描述”方法,用以告诉外界该对象具有的状态信息

  • 方法来源 : description 是 NSObject 中定义的, 所有的Objective—C对象都有该方法;
  • 默认方法 : description 默认方法返回 <类名: 地址>;
  • 输出对象 : NSLog() 函数输出一个对象, 其实输出的是该对象的 description 方法;

2. 重写description

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface FKApple : NSObject
@property (nonatomic, copy) NSString* color;
@property (nonatomic, assign) double weight;
- (id)initWithColor:(NSString* )color weight:(double)weight;
@end
NS_ASSUME_NONNULL_END

#import "FKApple.h"

@implementation FKApple
- (id)initWithColor:(NSString* )color weight:(double)weight {
    if(self = [super init]) {
        self.color = color;
        self.weight = weight;
    }
    return self ;
}
-(NSString*)description {
    return [NSString stringWithFormat:@"<FKApple[_color=%@,_weight=%g]>",self.color,self.weight];
}
@end
#import <Foundation/Foundation.h>
#import "FKApple.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        FKApple* p=[[FKApple alloc] initWithColor:@"红色" weight:5.68];
        NSLog(@"%@",p);
    }
    return 0;
}

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

== 或 isEqual : 方法

(1) “==” 运算符

“==” 简介 :

– 作用 : 是地址比较

简单比较了俩个基本类型的值是否相同,不要求数据类型严格相同,1.0与1做比较返回1
当用==比较俩个指针类型的变量,他俩必须指向同一对象,指针保存的是地址,本质上比较的是地址是否一致

– 前提 : 两个变量都是基本类型, 两个变量相等返回 true; 指针类型变量比较地址没有任何意义;
在这里插入图片描述

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

可以看到输出 1 0 1 0,最后一句话还会编译警告,因为NSData不是NSSting 的子类,没有继承关系。

isEqual的重写

  • 在NSObject中,默认isEqual与==是毫无差别的,对于指针的比较,也是比较地址是否一致,但在NSString中,已经改写了isEqual,他比较的每个字符是否相同。
  • 我们想让isEqual比较其他的东西,就需要对他进行改写。

定一个类

#import <Foundation/Foundation.h>
@interface FKUser :NSObject
@property(nonatomic, copy) NSString * name;
@property(nonatomic, copy) NSString * idStr;
- (id) initWithName : (NSString *) name idStr :(NSString *) idStr;
@end

#import "FKUser.h"

@implementation FKUser
-(id) initWithName:(NSString *)name idStr: (NSString *)idStr {
    if (self = [super init]) {
        self.name = name;
        self.idStr = idStr;
    }
    return self;
}
-(BOOL) isEqual: (id)other {
    if (self == other) {
        return YES;
    }
    // other 是FKUser的实例
    if (other != nil &&[other isMemberOfClass:FKUser.class]){        FKUser * target = (FKUser *)other;
        return [self.idStr isEqual: target.idStr];
    }
    return NO;
    
}
@end

#import "FKUser.h"
int main(int argc, char * argv[]) {
    @autoreleasepool {
        FKUser *p1 = [[FKUser alloc] initWithName: @"s1" idStr: @"123456"];
        FKUser *p2 = [[FKUser alloc] initWithName: @"s2" idStr: @"123456"];
        FKUser *p3 = [[FKUser alloc] initWithName: @"s3" idStr: @"111111"];
        NSLog(@"%d", [p1 isEqual: p2]);
        NSLog(@"%d", [p2 isEqual: p3]);
    }
}

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值