iOS 開發:Foundation 框架詳盡總結之『數字、結構體、日期、文件類』

本文對Foundation框架中一些數字類(NSNumber)、常用結構體類(CGPoint、CGSize、CGRect、CGRange和NSValue)、日期類(NSDate、NSCalendar)和文件類(NSFileManager)的使用做一個詳細的總結。

1.數字類(NSNumber)

1. NSNumber介紹

  • NSArray\NSDictionary中只能存放OC對象,不能存放int\float\double等基本數據類
  • 如果需要使用將基本數據的值作為對象使用,比如說放進數組或字典中,需要先將基本數據類型包裝成OC對象,可使用NSNumber類
  • NSNumber可以根據基本數據的類型創建對象,這樣就可以間接將基本數據類型存進NSArray\NSDictionary中

2. NSNumber的創建

  • 以前NSNumber的創建方式
- (NSNumber *)numberWithInt:(int)value;
- (NSNumber *)numberWithDouble:(double)value;
- (NSNumber *)numberWithBool:(BOOL)value;
  • 示例
int age = 10;
double number= 5.1;
int value =  6;

// 將基本數據類型轉換為對象類型
NSNumber *ageN = [NSNumber numberWithInt:age];
NSNumber *numberN = [NSNumber numberWithDouble:number];
NSNumber *valueN = [NSNumber numberWithInt:value];
  • 現在NSNumber的創建方式
@10;
@5.1;
@YES;
@(num);
  • 示例
NSNumber *ageN = @10;
NSNumber *numberN = @5.1;
NSNumber *valueN = @6;
NSNumber *flag = @YES;

3. 從NSNumber對象中的到基本類型數據

- (char)charValue;
- (int)intValue;
- (long)longValue;
- (double)doubleValue;
- (BOOL)boolValue;
- (NSString *)stringValue;
- (NSComparisonResult)compare:(NSNumber *)otherNumber;
- (BOOL)isEqualToNumber:(NSNumber *)number;
  • 示例
NSNumber *ageN = @10;

// 2.將對象類型轉換為基本數據類型
int age = [ageN intValue];
NSLog(@"age = %d", age);

輸出結果:age = 10

4. NSNumber判斷大小

  • 判斷兩個數相等- (BOOL)isEqualToNumber:(NSNumber *)number;
NSNumber *num1 = @10;
NSNumber *num2 = @10;

if ([num1 isEqualToNumber:num2] == YES) {
    NSLog(@"num1 == num2");
} else {
    NSLog(@"num1 != num2")
}

輸出結果:num1 == num2
  • 判斷一個數是否相等、小于或大于另一個數- (NSComparisonResult)compare:(NSNumber *)otherNumber;
NSNumber *num1 = @20;
NSNumber *num2 = @10;

if ([num1 compare:num2] == NSOrderedSame) {     // 相等
    NSLog(@"num1 == num2");
} else if ([num1 compare:num2] == NSOrderedAscending) { // 小于
    NSLog(@"num1 < num2");
} else if ([num1 compare:num2] == NSOrderedDescending) { // 大于
    NSLog(@"num1 > num2");
}

輸出結果:num1 > num2

2. 結構體類(CGPoint、CGSize、CGRect、CGRange和NSValue)

1. 結構體介紹

  • 在iOS開發中,我們經常會用到一些結構體,比如定義矩形原點坐標的結構體CGPoint、定義矩形尺寸的結構體CGSize、同時定義矩形原點和尺寸的結構體CGRect、描述位置和大小范圍的結構體NSRange等。

2. NSPoint和CGPoint

  • CGPoint和NSPoint是同義的
  • CGPoint代表的是二維平面中的一個點
  • CGPoint有2個成員
    • CGFloat x:表示該矩形原點的橫坐標位置
    • CGFloat y:表示該矩形原點的縱坐標位置
typedef CGPoint NSPoint;
// CGPoint的定義
struct CGPoint {
  CGFloat x;
  CGFloat y;
};
typedef struct CGPoint CGPoint;
typedef double CGFloat;
  • 可以使用CGPointMake和NSMakePoint函數創建CGPoint
CGPoint point = CGPointMake(10.0, 10.0);

3. NSSize和CGSize

  • CGSize和NSSize是同義的
  • CGSize代表的是二維平面中的某個物體的尺寸(寬度和高度)
  • CGSize有2個成員
    • CGFloat width:表示該矩形尺寸的寬
    • CGFloat height:表示該矩形尺寸的高
typedef CGSize NSSize;
// CGSize的定義
struct CGSize {
  CGFloat width;
  CGFloat height;
};
typedef struct CGSize CGSize;
  • 可以使用CGSizeMake和NSMakeSize函數創建CGSize
CGSize size =  CGSizeMake(20.0, 20.0);

4. NSRect和CGRect

  • CGRect和NSRect是同義的
  • CGRect代表的是二維平面中的某個物體的位置和尺寸
  • CGRect有2個成員
    • CGPoint origin:表示該矩形原點
    • CGSize sizet:表示該矩形尺寸
typedef CGRect NSRect;
// CGRect的定義
struct CGRect {
  CGPoint origin;
  CGSize size;
};
typedef struct CGRect CGRect;
  • 可以使用CGRectMake和NSMakeRect函數創建CGRect
CGRect rect = CGRectMake(10.0, 10.0, 20.0, 20.0);

5. NSRange

  • 沒有CGRange
  • NSRange表示事物的一個范圍,通常是字符串里的字符范圍或者數組里的元素范圍
  • NSRange有2個成員
    • NSUInteger location : 表示該范圍的起始位置
    • NSUInteger length : 表示該范圍內的長度
  • 比如@“I love you”中的@“you”可以用location為7,length為3的范圍來表示
// NSRange定義
typedef struct _NSRange {
    NSUInteger location;
    NSUInteger length;
} NSRange;
  • 可以使用NSMakeRange函數創建NSRange,也可以直接創建
// 方式1
NSRange range;
range.location = 7;
range.length = 3;

// 方式2
NSRange range = {7, 3};
或者
NSRange range = {.location = 7,.length = 3};

// 方式3 : 使用NSMakeRange函數
NSRange range = NSMakeRange(7, 3);

6. NSValue

  • 我們有時候需要將結構體存儲在集合中,但不能直接坐到。
  • Foundation提供了NSValue類將結構體轉換為對象,并把它存儲在集合中。
  • 將結構體包裝成NSValue對象
+ (NSValue *)valueWithPoint:(NSPoint)point;
+ (NSValue *)valueWithSize:(NSSize)size;
+ (NSValue *)valueWithRect:(NSRect)rect;
  • 示例
CGPoint point = NSMakePoint(10, 20);

NSValue *value = [NSValue valueWithPoint:point];
NSArray *arr = @[value];
NSLog(@"%@", arr);

輸出結果:
(
    "NSPoint: {10, 20}"
)
  • 從NSValue對象取出之前包裝的結構體
- (NSPoint)pointValue;
- (NSSize)sizeValue;
- (NSRect)rectValue;
  • 示例
CGPoint point = NSMakePoint(10, 20);

NSValue *value = [NSValue valueWithPoint:point];
CGPoint getPoint = [value pointValue];
NSLog(@"%lf %lf",getPoint.x,getPoint.y);

輸出結果:10.000000 20.000000
  • 用NSValue對象包裝任意數據
    • value參數:所包裝數據的地址
    • type參數:用來描述這個數據類型的字符串,用@encode指令來生成
+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type;
  • 從NSValue中取出所包裝的任意數據
- (void)getValue:(void *)value;
  • 示例
// 1.利用NSValue包裝自定義的結構體
typedef struct{
    int age;
    char *name;
    double height;
}Person;
Person p = {20, "abc", 1.75};

// valueWithBytes: 接收一個指針, 需要傳遞需要包裝的結構體的變量的地址
// objCType: 需要傳遞需要包裝的數據類型
NSValue *value = [NSValue valueWithBytes:&p objCType:@encode(Person)];

// 2.從NSValue中取出自定義的結構體變量
Person res;
[value getValue:&res];
NSLog(@"age = %i, name = %s, height = %f", res.age, res.name, res.height);

輸出結果:age = 20, name = abc, height = 1.750000

3. 日期類(NSDate、NSCalendar)

1. NSDate

  • NSDate可以用來表示時間,可以進行一些常見的日期\時間處理
  • 一個NSDate對象就代表一個時間
  • [NSDate date]返回的就是當前時間,注意此時間是世界標準時間,準確時間應加上當前時區與世界標準時間的偏移量
NSDate *now = [NSDate date];  // 未偏移量的當前時間
NSLog(@"now = %@", now);  

// 獲取當前所處的時區
NSTimeZone *zone = [NSTimeZone systemTimeZone];
// 獲取當前時區和指定時區的時間差
NSInteger seconds = [zone secondsFromGMTForDate:now];
// 得到準確時間    
NSDate *newDate = [now dateByAddingTimeInterval:seconds];
NSLog(@"newDate = %@", newDate);

輸出結果:
now = 2016-08-07 01:42:44 +0000
newDate = 2016-08-07 09:42:44 +0000
  • 格式化日期NSDate -> NSString
// 創建時間
NSDate *now = [NSDate date];
// 創建時間格式化
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
// 指定格式
// yyyy:年 
// MM:月 
// dd:日
// HH:24小時 hh:12小時
// mm:分 
// ss:秒
// Z:時區
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
// 格式化時間
NSString *str = [formatter stringFromDate:now];
NSLog(@"%@", str);

輸出結果:2016-08-07 09:44:54
  • 格式化日期NSString -> NSDate
NSString *str = @"2015-06-28 19:53:24";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date = [formatter dateFromString:str];
NSLog(@"%@", date);

輸出結果:2015-06-28 11:53:24 +0000

2. NSCalendar

  • 結合NSCalendar和NSDate能做更多的日期\時間處理

  • 獲得NSCalendar對象NSCalendar *calendar = [NSCalendar currentCalendar];

  • 獲得年月日- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date;

NSDate *date = [NSDate date];
// 創建日歷對象
NSCalendar *calendar = [NSCalendar currentCalendar];
// 利用日歷對象獲取年月日時分秒,將需要獲取的類型并入NSCalendarUnit中
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
NSDateComponents *cmps =[calendar components:type fromDate:date];
NSLog(@"year = %lu", cmps.year);
NSLog(@"month = %lu", cmps.month);
NSLog(@"day = %lu", cmps.day);
NSLog(@"hour = %lu", cmps.hour);
NSLog(@"minute = %lu", cmps.minute);
NSLog(@"second = %lu", cmps.second);
NSLog(@"date = %@", date);

輸出結果:
year = 2016
month = 8
day = 7
hour = 9
minute = 57
second = 35
date = 2016-08-07 01:57:35 +0000
  • 比較兩個日期的差距- (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)startingDate toDate:(NSDate *)resultDate options:(NSCalendarOptions)opts;
// 確定時間
NSString *time1 = @"2016-06-23 12:18:15";
NSString *time2 = @"2016-06-28 10:10:10";
// 將時間轉換為date
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSDate *date1 = [formatter dateFromString:time1];
NSDate *date2 = [formatter dateFromString:time2];
// 創建日歷
NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit type = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
// 利用日歷對象比較兩個時間的差值
NSDateComponents *cmps = [calendar components:type fromDate:date1 toDate:date2 options:0];
// 輸出結果
NSLog(@"兩個時間相差%ld年%ld月%ld日%ld小時%ld分鐘%ld秒", cmps.year, cmps.month, cmps.day, cmps.hour, cmps.minute, cmps.second);

輸出結果:兩個時間相差0年0月4日21小時51分鐘55秒

4. 文件類(NSFileManager)

1. NSFileManager介紹

  • NSFileManager是用來管理文件系統的
  • 它可以用來進行常見的文件\文件夾操作

2. NSFileManager用法

  • 判斷path這個文件\文件夾是否存在- (BOOL)fileExistsAtPath:(NSString *)path;
NSFileManager *manager = [NSFileManager defaultManager];

// 可以判斷文件
BOOL flag = [manager fileExistsAtPath:@"/Users/Walkers/Desktop/test.txt"];
NSLog(@"flag = %i", flag);

// 可以判斷文件夾
flag = [manager fileExistsAtPath:@"/Users/Walkers/Desktop/未命名文件夾"];
NSLog(@"flag = %i", flag);
  • 判斷path這個文件\文件夾是否存在,isDirectory代表是否為文件夾- (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory;
NSFileManager *manager = [NSFileManager defaultManager];
BOOL directory = NO;
BOOL flag = [manager fileExistsAtPath:@"/Users/Walkers/Desktop/未命名文件夾" isDirectory:&directory];
NSLog(@"flag = %i, directory = %i", flag, directory);
  • 判斷path這個文件\文件夾是否可讀- (BOOL)isReadableFileAtPath:(NSString *)path;

  • path這個文件\文件夾是否可寫- (BOOL)isWritableFileAtPath:(NSString *)path;

    • 系統目錄不允許寫入
  • path這個文件\文件夾是否可刪除- (BOOL)isDeletableFileAtPath:(NSString *)path;

    • 系統目錄不允許刪除

3. NSFileManager的文件訪問

  • 獲得path這個文件\文件夾的屬性- (NSDictionary *)attributesOfItemAtPath:(NSString *)path error:(NSError **)error;
    NSFileManager *manager = [NSFileManager defaultManager];
    NSDictionary *dict = [manager attributesOfItemAtPath:@"/Users/Walkers/Desktop/test.txt" error:nil];
    NSLog(@"dit = %@", dict);
  • 獲得path的當前子路徑- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;

  • 獲得文件內容- (NSData *)contentsAtPath:(NSString *)path;

    NSFileManager *manager = [NSFileManager defaultManager];
    NSArray *paths = [manager contentsOfDirectoryAtPath:@"/Users/Walkers/Desktop/" error:nil];
    NSLog(@"paths = %@", paths);
  • 獲得path的所有子路徑
    • - (NSArray *)subpathsAtPath:(NSString *)path;
    • - (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
    NSFileManager *manager = [NSFileManager defaultManager];
    NSArray *paths = [manager subpathsAtPath:@"/Users/Walkers/Desktop/"];
    NSLog(@"paths = %@", paths);

4. NSFileManager的文件操作

  • 拷貝- (BOOL)copyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

  • 移動(剪切)- (BOOL)moveItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath error:(NSError **)error;

  • 刪除- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;

  • 創建文件夾(createIntermediates為YES代表自動創建中間的文件夾)- (BOOL)createDirectoryAtPath:(NSString *)path withIntermediateDirectories:(BOOL)createIntermediates attributes:(NSDictionary *)attributes error:(NSError **)error;

    NSFileManager *manager = [NSFileManager defaultManager];
    BOOL flag = [manager createDirectoryAtPath:@"/Users/Walkers/Desktop/test" withIntermediateDirectories:YES attributes:nil error:nil];
    NSLog(@"flag = %i", flag);
  • 創建文件(NSData是用來存儲二進制字節數據的)- (BOOL)createFileAtPath:(NSString *)path contents:(NSData *)data attributes:(NSDictionary *)attr;
    NSString *str = @"abc";
    NSData  *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSFileManager *manager = [NSFileManager defaultManager];
    BOOL flag = [manager createFileAtPath:@"/Users/Walkers/Desktop/abc.txt" contents:data attributes:nil];
    NSLog(@"flag = %i", flag);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容