OC: 类的扩展、类的延展、协议、 NSDate
NSDateFormatter
指定⽇日期格式:
NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate 处理日期或者时间的一个类,用于获取日期
NSDate * date = [NSDate date];//是个类方法
全球份24个时区,我们控制台打印的是0时区的时间
//获取当前的日期时间
NSDate * date = [NSDate date];//是个类方法全球份24个时区,我们控制台打印的是0时区的时间
NSLog(@"%@",date);
//获取明天此时的时间 ,计算明天距离此时的时间,以及本单位秒来计算的
NSDate * date1 = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
NSLog(@"tomorrow = %@",date1);
//获取昨天的日期
NSDate * yesterday = [NSDate dateWithTimeIntervalSinceNow:-24*60*60];
NSLog(@"yesterday = %@",yesterday);
dateWithTimeIntervalSinceNow方法
//获取1970.1.1到此时的时间间隔
NSTimeInterval timeInterval = [datenow timeIntervalSince1970];
NSLog(@"%f",timeInterval);//结果是以秒为单位
//获取两个日期的时间间隔
NSTimeInterval interval = [datenow timeIntervalSinceDate:tomorrow];//用前面日期 - 后面的日期 (datenow - tomorrow)以秒为单位
NSLog(@"%f",interval);
NSLog(@"获取两个日期的时间间隔 %.1f 天",interval/24/60/60);//计算相差天数
//获取据当前日期的时间间隔
NSTimeInterval currentInterval = [yesterday timeIntervalSinceNow];
NSLog(@"据当前日期的时间间隔 %.1f 天",currentInterval/24/60/60);
//两个日期之间的比较(返回一个枚举值)默认是升序比较
NSComparisonResult result = [yesterday compare:tomorrow];
NSLog(@"%ld",result);
//判断两个日期是否相等(返回BOOL值)
BOOL isEqual = [tomorrow isEqualToDate:yesterday];
if (isEqual) {
NSLog(@"两个日期相等");
}else{
NSLog(@"两个日期不相等");
}
//练习 控制台输入一个时间间隔 如果据此时差值在60秒 就提示“刚刚” 如果在60秒之外小于3600秒 就提示“XX 分钟前”,如果大于 3600 秒 就输出 “XX 小时前”
NSTimeInterval time = 0;
printf("请输入时间");
scanf("%lf",&time);
if (time < 60) {
NSLog(@"刚刚");
}
if(time > 60 && time < 3600){
NSLog(@"%.f分钟前",time/60);
}
if (time > 3600) {
NSLog(@"%.f小时前",time/60/60);
}
时区的转化那点事 http://my.oschina.net/yongbin45/blog/151376
下午所学:
分类:1.作用是为不知道源代码的类提供方法(扩展功能)
2. 分类并不是一个类,只是为我们原有的类扩展功能,就是添加方法,而且只能添加方法,不能添加实例变量
cmd + ctrl +方向键 对(.h 与 .m文件的切换)
对于分类的使用,也需要在主文件里导入
Extension 与 category 的区别:前者是一个类的私有方法,后者是为不知道源代码的类的方法的扩展
1.制定协议内容
2.设置代理人对象
3.制定代理人
4.代理人对象服从协议
5.代理人实现协议中的方法
6.通知代理人执行
//笑笑糖语法只能给不可变数组用
//代理delegate
//
// main.m
// Protocol(协议)
//
// #import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
#import "BabySister.h"
#import "Mother.h" //1.制定协议
//2。对象遵循协议
//3.设置代理人
//4.代理人实现协议中的方法
//5.通知代理人去执行
//6.代理人去执行协议
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"故事开始, World!");
NSLog(@"在某一天,一个风尘仆仆的美男子,出现在一个漆黑的夜晚....");
NSLog(@"突然...");
NSLog(@"前面出现了一个美如天仙的如花姑娘。。。");
NSLog(@"很快,两人就这样认识了");
NSLog(@"很快,两人就步入了婚姻的殿堂");
Woman *honey = [[Woman alloc]initWithName:@"shuhao" age:@""];
Man *man = [[Man alloc]initWithName:@"pengpeng" age:@""];
NSLog(@"shuhao:你要是帮我做这几件事,我就嫁给你");
NSLog(@"pengpeng :I DO");
//设置代理人
[honey setDelegate:man];
//通知代理人执行
[honey comeon]; Mother * mother = [[Mother alloc]initWithName:@"mom" age:@""];
BabySister * sister = [[BabySister alloc]initWithName:@"xiao" age:@""]; }
return ;
}
main.m 文件
//
// Man.h
// Protocol(协议)
//
// #import "Person.h"
#import "Woman.h" //代表 Man 这个类服从 MarriageDeal 的协议
@interface Man : Person<MarriageDeal>//一个类服从某协议的写法
//履行协议
- (void)cook;
- (void)doHousework;
- (void)makeABaye;
@end
man.h 文件
//
// Man.m
// Protocol(协议)
// #import "Man.h" @implementation Man
//履行协议
- (void)cook{
NSLog(@"给老婆做饭吃");
}
- (void)doHousework{
NSLog(@"给老婆做家务,不容易啊");
}
- (void)makeABaby{
NSLog(@"好吧,做个玩具娃娃");
}
@end
man.m 文件
//
// Woman.h
// Protocol(协议)
//
// #import "Person.h"
//婚前约定(
//做饭 做家务 生孩子
@protocol MarriageDeal <NSObject>
//@required 是必须实现的方法(只要其他的类遵循这个协议那就必须去做)
//@optional 是可以选择实现的方法
@required//强制必须做的
- (void)cook;
- (void)doHousework;
@optional//可选做的,可实现,也可以不实现
//协议的默认状态是@required
- (void)makeABaby;
@end @interface Woman : Person
{
//代理
id<MarriageDeal>_delegate;//设置代理对象
//<协议名> 代表代理服从协议
//谁去执行谁就是代理
//< > 里面是协议
//id就是可以代之所有的对象 }
//为代理写setter 方法
- (void)setDelegate:(id)delegate;
//通知代理人去是实现对应的方法
- (void)comeon;
@end
woman.h 文件
//
// Woman.m
// Protocol(协议)
//
// #import "Woman.h" @implementation Woman
//为代理写setter 方法
- (void)setDelegate:(id)delegate{
_delegate = delegate;
}
//通知代理人去是实现对应的方法
- (void)comeon{
if (_delegate) {
[_delegate cook];
[_delegate doHousework];
[_delegate makeABaby];
}
}
@end
woman.m 文件
//
// Person.h
// Protocol(协议)
//
// #import <Foundation/Foundation.h> @interface Person : NSObject
{
NSString *_name;
NSString *_age;
}
//初始化方法
- (id)initWithName:(NSString *)name
age:(NSString *)age; @end
person.h文件
//
// Person.m
// Protocol(协议)
//
// #import "Person.h" @implementation Person
//初始化方法
- (id)initWithName:(NSString *)name
age:(NSString *)age{
self = [super init];
if (self) {
_name = name;
_age = age;
}
return self;
}
@end
person.m文件
// 分类 category
//
// main.m
// Category
//
// #import <Foundation/Foundation.h>
#import "NSString+Addition.h"
#import "NSDictionary+Addition.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
//category 分类 类目 为不知道源代码的一些类(系统的类)来扩充功能
NSString * str = @"HHH";
[str sayHi];
//只能添加方法
//为 NSString 扩充方法 :获取字符串的首字母并大写
NSString * oneFirst = [str getFirstCharacter];
NSLog(@"%@",oneFirst);
NSString * dataSet = @"";
NSString * new = [dataSet change];
NSLog(@"%@",new);
NSString * strr = @"";
[strr stringToValue];
NSInteger b = ;
NSString * new2 = [dataSet transToString:b];
NSLog(@"%@",new2);
NSDictionary * dic = @{@"Y":@"Yob",@"N":@"niu",@"Z":@"Zhang"};
NSArray * keys = [dic allKeysOrdered];
NSLog(@"%@",keys); }
return ;
}
main.m
//
// NSString+Addition.h
// Category
//
// #import <Foundation/Foundation.h> //分类:1.作用是为不知道源代码的类提供方法(扩展功能)
// 2. 分类并不是一个类,只是为我们原有的类扩展功能,就是添加方法,而且只能添加方法,不能添加实例变量
@interface NSString (Addition)
- (void)sayHi;
//获取字符串的首字母并以大写的形式
- (NSString *)getFirstCharacter;
//把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19"
- (NSDate *)change;
//把基本整型转化为字符串类型
- (NSString *)transToString:(NSInteger)num;
//把字符串转化为基本的整型
- (NSInteger)stringToValue; @end
NSString+Addition.h
//
// NSString+Addition.m
// Category
//
// #import "NSString+Addition.h" @implementation NSString (Addition)
- (void)sayHi{
NSLog(@"我是一个分类的方法");
}
//获取字符串的首字母并以大写的形式
- (NSString *)getFirstCharacter{
// capitalizedString 让首字母大写
// return [[self substringToIndex:1]capitalizedString];
// uppercaseString 是让字母全部大写
return [[self substringToIndex:]uppercaseString];
}
//把对应的字符串日期转化为特定的形式@"20150819"--@"2015.08.19"
- (NSString *)change{
NSMutableString * newStr = [NSMutableString stringWithString:self];
if ([self length] < ) {
NSLog(@"长度不够");
}else{
NSString *str = @"/";
[newStr insertString:str atIndex:];
[newStr insertString:str atIndex:];
}
return newStr;
}
//把基本整型转化为字符串类型
- (NSString *)transToString:(NSInteger)num{
return [NSString stringWithFormat:@"%lu",num ];
}
//把字符串转化为基本的整型
- (NSInteger)stringToValue{
return [self integerValue];
}
@end
NSString+Addition.m
//
// NSDictionary+Addition.h
// Category
//
// #import <Foundation/Foundation.h> @interface NSDictionary (Addition)
//获取所有的key值然后给key排序然后返回给我们
- (NSArray *)allKeysOrdered;
@end
NSDictionary+Addition.h
//
// NSDictionary+Addition.m
// Category
//
// #import "NSDictionary+Addition.h" @implementation NSDictionary (Addition)
//获取所有的key值然后给key排序然后返回给我们
- (NSArray *)allKeysOrdered{
//
// NSArray * allkeys = [self allKeys];
// NSArray * sort = [allkeys sortedArrayUsingSelector:@selector( compare:)];
// return sort;
//
// return [[self allKeys]sortedArrayUsingSelector:@selector(compare:)];
//
return [[self allKeys]sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2];
}];
}
@end
NSDictionary+Addition.m
//延展(Extension)
//
// main.m
// 08-19(延展)
//
// #import <Foundation/Foundation.h>
#import "Person.h" int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
Person * per = [[Person alloc]init];
//下面的两个方法不可见的
//[per saygoodbye]; 在这里不能被调用,只能在类的内部使用
//[per introduce];
[per test]; }
return ;
}
main.m
//
// Person.h
// 08-19(延展)
//
// #import <Foundation/Foundation.h> //.h文件声明实例变量和方法 用于为外界提供接口
//.m文件具体实现方法
@interface Person : NSObject
- (void)test;
@end
person.h
//
// Person.m
// 08-19(延展)
//
// #import "Person.h" //在 Person.m 文件里添加一个 延展
@interface Person ()
{
//私有的实例变量,仅仅是内部访问的
NSString * _age;
CGFloat _height;
}
//下面的方法声明注释掉,下面一样可以实现,所以对于私有的方法可以直接在内部实现
//- (void)saygoodbye;
//- (void)introduce;
@end
//延展 Extension 主要是在 .m文件里面 为一个类添加私有的方法和实例变量,这些实例变量和方法就只能供应自己使用,外界不能使用
@implementation Person
- (void)test{
_age = @"";
NSLog(@"测试。。");
[self saygoodbye];
[self introduce];
}
- (void)saygoodbye{
NSLog(@"goodbye");
}
- (void)introduce{
NSLog(@"我年龄是 %@ 岁",_age);
}
@end
person.m
.h文件声明实例变量和方法 用于为外界提供接口
.m文件具体实现方法
Category 1.分类是为一些没有源代码的类里面添加一些,源代码里没有实现的方法 2.注意他的文件的创建 3.分类用于我们向该类添加方法,而且只能是添加方法,不能再往里面添加实例变量。添加一个分类后的文件是
@implementation NSString (Addition)//注意这里的写法(这是系统自动生成的) 注意那个分类的创建步骤,记住
@end
1.延展 是管理类的私有方法,把代码写到原始的 .m文件里面
延展吧一个方法用到的实例变量(这里是当前类就是私有的了)的声明,与实现都写在一个类(当前类里面),也就是@interface@end 与@implementation @end写在一起。延展 Extension 主要是在 .m文件里面 为一个类添加私有的方法和实例变量,这些实例变量和方法就只能供应自己使用,外界不能使用
注意:为一个类添加一些私有变量的写法 如Person类里面添加两个私有变量
#import "Person.h"
@interface Person ()//这里要注意与普通定义的区别
{
NSString * _group;//家族背景
NSString *_sattion;//社会地位
}
@end
@implementation Person
@end
注意:私有变量里面定义的方法可以吧方法的声明省去,直接在@implementation @end里面实现
protocol 1.协议是iOS开发中常⽤的技术。
协议是⼀套标准(⼀堆⽅法的声明),只有.h⽂件。就像⼀张任
务清单(或便利贴),上⾯写了⼀堆需要处理的事。清单交给谁,
谁就要去完成清单上规定的任务。
接受协议的对象实现协议中定义的⽅法。即:清单交给谁,谁就
要去完成清单上规定的任务。
协议中方法的类型有 @optional 代理者可做可不做的 @required 代理者必须做的
协议protocol的定义的格式要注意,他是在@interface @end的@interface的上面写以 @protocol 方法清单 @end 书写
//获取字符串的首字母并以大写的形式
- (NSString *)getFirstCharacter{
// capitalizedString 让首字母大写
// return [[self substringToIndex:1]capitalizedString];
// uppercaseString 是让字母全部大写
return [[self substringToIndex:1]uppercaseString];
}
NSString * str = @"123"; [str integerValue]; 把字数字符串转化为整型数字
OC: 类的扩展、类的延展、协议、 NSDate的更多相关文章
- 类的扩展--类目和延展--ios
person+money.h 这是类目类 #import "Person.h" //这是扩展person类的接口类,独立一个文件 @interface Person (Money ...
- java基础(1)-几种获取类的扩展方式
摘要 在日常开发过程中经常需要获取类的扩展集.即获取类的子类集(抽象类),或者接口实现类.比如说状态模式中,状态构建类,策略模式中的,策略构造方式.本文介绍几种获取方式. 实现 以策略模式为例 定义了 ...
- C#中的扩展类的理解
扩展类是一种静态的一种类的调用方法,通过实例化进行调用.利用this进行指正该类,有参数的时候直接在后面追加参数. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- [Django REST framework - 视图组件之视图基类、视图扩展类、视图子类、视图集]
[Django REST framework - 视图组件之视图基类.视图扩展类.视图子类.视图集] 视图继承关系 详图见文章末尾 视图组件可点我查看 两个视图基类:APIView.GenericAP ...
- Java对象与类—对象与类
1.类 类(class)是构造对象的模板,具体点说类就是对具有相同性质,相同行为的一群对象的抽象说明.由类构造(construst)对象的过程称为创建类的实例(instance). 2.对象 对象是类 ...
- OC基础:类的扩展.协议 分类: ios学习 OC 2015-06-22 19:22 34人阅读 评论(0) 收藏
//再设计一个类的时候,有些方法需要对外公开(接口),有些仅供内部使用. 类的扩展:为类添加新的特征(属性)或者方法 对已知类: 1.直接添加 2.继承(在其子类中添加实例变量和方法) 3.使用ext ...
- iOS学习19之OC类的扩展
为一个类扩展功能:1.子类化:2.修改源代码:3.定义协议:4.Category:类目 1.Category 1> Category的作用 Category:也叫分类,类目,是为没有源代码的类扩 ...
- (转载)OC学习篇之---类的延展
前一篇文章我们介绍了类的类目概念和使用,那么这篇文章我们继续来介绍一下OC中的一个特性:延展. 其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前 ...
- OC学习篇之---类的延展
来源:http://blog.csdn.net/jiangwei0910410003/article/details/41775603 前一篇文章我们介绍了类的类目概念和使用:http://blog. ...
随机推荐
- java中对浮点数精度的处理DecimalFormat
DecimalFormat是一个队浮点数进行格式化输出的利器,比如我们要输出一个保留一位小数的浮点数,可以键入如下代码: DecimalFormat df = new DecimalFormat(&q ...
- #define XXX do{...}while(0)
<ol> <li>函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以传参时要格外小心.</li> <li>调用真正函数的 ...
- Android Window 9问9答
1.简述一下window是什么?在android体系里 扮演什么角色? 答:window就是一个抽象类,他的实现类是phoneWindow.我们一般通过windowManager 来访问window. ...
- 在Linux上安装多Jboss个需要修改的端口
如果在一台机器上部署了多个jboss server,需要修改相关端口以避免端口冲突.目前确认需要修改的配置如下一.vi $JBOSS_HOME/server/default/conf/jboss-se ...
- hdu 3537(博弈,翻硬币)
题意:给定了每个正面朝上的硬币的位置,然后每次可以翻1,2,3枚硬币,并且最右边的硬币开始必须是正面朝上的. 分析: 约束条件6:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初 ...
- [Everyday Mathematics]20150304
证明: $$\bex \frac{2}{\pi}\int_0^\infty \frac{1-\cos 1\cos \lm-\lm \sin 1\sin \lm}{1-\lm^2}\cos \lm x\ ...
- Python函数练习:冒泡算法+快速排序(二分法)
冒泡算法: #-*- coding: UTF-8 -*-#冒泡排序 def func(lt):if type(lt).__name__ !='list' and type(lt).__name__ ! ...
- 高手就用Chrome不安全模式
背景:最近玩CSS3和HTML玩得不可开交. 既然要用浏览器的话,就最好在浏览器中设置一个主页,以前徒简洁就一直用百度的搜索页做主页,但是现在百度邪恶的各种广告实在让我恶心,而且一些文献资料中国网站上 ...
- Python单例模式研究
方法一 import threading class Singleton(object): __instance = None __lock = threading.Lock() # used t ...
- Java多线程学习总结--线程概述及创建线程的方式(1)
在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...