【黑马程序员】---Foundation框架总结01

------- android培训java培训、期待与您交流! ----------


Foundation框架总结---(01)


1.结构体

主要讲了一下4个结构体


(1) NSRange(location, length)

NSRange是一个结构体,其中location是一个以0为开始的index,length是表示对象的长度。他们都是NSUInteger类型。


NSRange的原型为:

typedef struct _NSRange {
     NSUInteger location;
     NSUInteger length;
     } NSRange;

心得体会:由此可见,NSRange是一个结构体,它由location和length两个成员组成。

typedef unsigned long NSUInteger;
NSRange的三种赋值方式:

NSRange r1 = {2, 4}; // 不用
NSRange r2 = {.location = 2, .length = 4};// 不用
NSRange r3 = NSMakeRange(2, 4); // 掌握
rangeOfString 方法:查找某个字符串在字符串的范围。

NSString *str = @"i love oc";
    // 如果找不到,length=0,location=NSNotFound==-1
    NSRange range = [str rangeOfString:@"java"];
    NSLog(@"loc = %ld, length=%ld", range.location, range.length);

心得体会:-1如果按照无符号整型打印输出是一大串数字


(2) NSPoint\CGPoint

NSPoint的原型为:

struct CGPoint {
     CGFloat x;
     CGFloat y;   // 其中x,y是double类型
     };
NSPoint 用法:

//NSPoint指的是位置
    NSPoint point;
    
    //给结构体里面的点进行赋值
    point.x = 10;
    point.y = 10;
    
    //快速创建点
    point = NSMakePoint(10, 18);
    
    //常见的是CGPointMake创建点的函数
    point = CGPointMake(29, 78);
    NSString* str2 = NSStringFromPoint(point);
    NSLog(@"point is %@",str2);

心得体会:CGPointMake 和 NSMakePoint是一样的。


(3)NSSize\CGSize

NSSize\CGSize原型:

struct CGSize {
     CGFloat width;
     CGFloat height;
     };
NSSize 用法:

NSSize size;
  
   size.width = 100;
   size.height = 12;
   size = NSMakeSize(12, 12);
   size = CGSizeMake(11, 11);
   
   NSString* str3 = NSStringFromSize(size);
   NSLog(@"%@",str3);

(4) NSRect\CGRect (CGPint CGSize)

NSRect\CGRect 的原型:

struct CGRect {
     CGPoint origin;
     CGSize size;
     };
赋值方式:

 CGRect r1 = CGRectMake(0, 0, 100, 50);
    
    CGRect r2 = { {0, 0}, {100, 90}};
    
    CGRect r3 = {p1, s2};
    
    // 使用CGPointZero等的前提是添加CoreGraphics框架
    CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
    
    // 表示原点
    // CGPointZero == CGPointMake(0, 0)
NSMakeRect函数源代码:

NS_INLINE NSRect NSMakeRect(CGFloat x, CGFloat y, CGFloat w, CGFloat h) {
     NSRect r;
     r.origin.x = x;
     r.origin.y = y;
     r.size.width = w;
     r.size.height = h;
     return r;
     }

其它重点函数用法:

(1)比较两个点是否相同(x、y)

BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
(2)判断一个矩形是否包含一个点

BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));
心得体会:

(1)学习结构体的API,一定要会对比学习,很多函数以及用法都是能猜出来的。

(2)比如CGPoint等同于NSPoint,但一般都用以CG开头的,因为它跨平台。

(3)CGPointZero == CGPointMake(0, 0),它表示原点,用处较多。

(4)使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架。


2.NSString 

(1)NSString  :不可变字符串

字符串的创建

1> 创建字符串的第一种方式

NSString *s1 = @"jack";

2> 创建字符串的第二种方式

NSString *s2 = [[NSString alloc] initWithString:@"jack"];
3 > 创建字符串的第种方式 

NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];
4> 创建字符串的第种方式

将C语言字符串转换成OC字符串

// C字符串 --> OC字符串
    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
5> 创建字符串的第种方式
将OC字符串转换成C语言字符串

const char *cs = [s4 UTF8String];
6> 创建字符串的第种方式

NSUTF8StringEncoding 用到中文就可以用这种编码

 NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];

URL : 资源路径
协议头://路径
file://
ftp://

创建文件URL的2种方式:

  NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];
	NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
7> 创建字符串的第种方式

NSString *s6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
一般都会有一个类方法跟对象方法配对

8> 创建字符串的第方式

[NSURL URLWithString:@"file:///Users/apple/Desktop/1.txt"];
9> 创建字符串的第种方式
[NSString stringWithFormat:@"age is %d", 10];
10> 创建字符串的第种方式

[NSString stringWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];


字符串导出的2种方式:

(1)写到文件中

[@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

(2)写到指定的URL中

NSString *str = @"4234234";
    NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/my2.txt"];
    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];


(2)NSMutableString : 可变字符串

1>创建可变字符串,并追加内容

    NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];
    // 拼接内容到s1的后面
    [s1 appendString:@" 11 12"];
2>从一个长字符串中删除指定字符串

    // 获取is的范围
    NSRange range = [s1 rangeOfString:@"is"];
    [s1 deleteCharactersInRange:range];
    
    NSString *s2 = [NSString stringWithFormat:@"age is 10"];
3>NSString也可以在已有字符串追加字符串,但是它实际上是重新创建了新的字符串

NSString *s3 = [s2 stringByAppendingString:@" 11 12"];
心得体会:

(1)在创建字符串时,一般都会有一个类方法跟对象方法配对,并且在日常写代码时,最好用类方法,简单。

(2)在学习Foundation框架时,要注意对比学习,很多东西都是相通的。

(3)这些API不用刻意去记忆,平时多敲代码多积累。


3.写一个函数,计算文件代码的行数,可以是文件也可以是文件夹

#import <Foundation/Foundation.h>


// 计算文件的代码行数
/*
 path : 文件的全路径(可能是文件夹、也可能是文件)
 返回值 int :代码行数
 */
NSUInteger codeLineCount(NSString *path)
{
    // 1.获得文件管理者
    NSFileManager *mgr = [NSFileManager defaultManager];
    
    // 2.标记是否为文件夹
    BOOL dir = NO; // 标记是否为文件夹
    // 标记这个路径是否存在
    BOOL exist = [mgr fileExistsAtPath:path isDirectory:&dir];
    
    // 3.如果不存在,直接返回0
    if(!exist)
    {
        NSLog(@"文件路径不存在!!!!!!");
        return 0;
    }
    
    // 代码能来到着,说明路径存在
    
    
    if (dir)
    { // 文件夹
        // 获得当前文件夹path下面的所有内容(文件夹、文件)
        NSArray *array = [mgr contentsOfDirectoryAtPath:path error:nil];
        
        // 定义一个变量保存path中所有文件的总行数
        int count = 0;
        
        // 遍历数组中的所有子文件(夹)名
        for (NSString *filename in array)
        {
            // 获得子文件(夹)的全路径
            NSString *fullPath = [NSString stringWithFormat:@"%@/%@", path, filename];
            
            // 累加每个子路径的总行数
            count += codeLineCount(fullPath);
        }
        
        return count;
    }
    else
    { // 文件
        // 判断文件的拓展名(忽略大小写)
        NSString *extension = [[path pathExtension] lowercaseString];
        if (![extension isEqualToString:@"h"]
            && ![extension isEqualToString:@"m"]
            && ![extension isEqualToString:@"c"])
        {
            // 文件拓展名不是h,而且也不是m,而且也不是c
            return 0;
        }
        
        // 加载文件内容
        NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        
        // 将文件内容切割为每一行
        NSArray *array = [content componentsSeparatedByString:@"\n"];
        
        // 删掉文件路径前面的/Users/apple/Desktop/iOS课堂共享/0722课堂共享/
        NSRange range = [path rangeOfString:@"/Users/apple/Desktop/iOS课堂共享/0722课堂共享/"];
        NSString *str = [path stringByReplacingCharactersInRange:range withString:@""];
        
        // 打印文件路径和行数
        NSLog(@"%@ - %ld", str, array.count);
        
        return array.count;
    }
}

int main()
{
    
    NSUInteger count = codeLineCount(@"/Users/apple/Desktop/iOS课堂共享/0722课堂共享");
    
    NSLog(@"%ld", count);
    return 0;
}
心得体会:

(1)首先,要知道计算一个文件行数的方法。然后,再利用递归,计算一个文件夹下所有文件的行数。

(2)注意这个函数[str componentsSeparatedByString:@"\n"],它是‘、n’将字符串进行切割,然后存储在数组中,求出数组的长度,即可求出单个文件的行数

(3)了解下NSFileManager文件管理者这个类。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip基于Django+python编写开发的毕业生就业管理系统支持学生教师角色+db数据库(毕业设计新项目).zip
毕设新项目基于python3.7+django+sqlite开发的学生就业管理系统源码+使用说明(含vue前端源码).zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我! 学生就业管理系统(前端) ## 项目开发环境 - IDE: vscode - node版本: v12.14.1 - npm版本: 6.13.4 - vue版本: @vue/cli 4.1.2 - 操作系统: UOS 20 ## 1.进入项目目录安装依赖 ``` npm install ``` ## 2.命令行执行进入UI界面进行项目管理 ``` vue ui ``` ## 3.编译发布包(请注意编译后存储路径) #### PS:需要将编译后的包复制到后端项目的根目录下并命名为'static' 学生就业管理系统(后端) ## 1.项目开发环境 - IDE: vscode - Django版本: 3.0.3 - Python版本: python3.7.3 - 数据库 : sqlite3(测试专用) - 操作系统 : UOS 20 ## 2.csdn下载本项目并生成/安装依赖 ``` pip freeze > requirements.txt pip install -r requirements.txt ``` ## 3.项目MySQL数据库链接错误 [点击查看解决方法](https://www.cnblogs.com/izbw/p/11279237.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值