IOS开发学习周报(一)
学习记录
概括
- 熟悉在Mac OS下的开发操作,熟悉系统操作、了解相关快捷键以及触摸板快捷操作以便提高后续开发效率。
- 学习Objective-C相关语法,实操完成螺旋矩阵的算法小程序,与之前学习的其他语言进行比较。
- 学习使用X-Code,并熟悉IOS工程结构,根据模板项目了解规范的项目结构。
数据类型及输出
参考博客:
https://blog.csdn.net/shulianghan/article/details/38544659
数据类型:
- 基本数据类型:整型, 字符型, 浮点型 (float 和 double), 枚举型
- 构造类型:数组类型, 结构体类型, 共用体类型
- 指针类型:最重要的数据类型, 所有的系统类, 自定义类都是指针
- 空类型:空类型只有一个值 nil, 该类型没有名称, 因此没有空类型的变量, 变量不能转换成空类型, 但是空类型可以转换成任何引用类型
数据类型输出 :
NSLog()简介 :
NSLog 是 Foundation 框架中功能强大的函数, 可以输出任何类型的数据
占位符 :
NSLog() 函数中各式与 C 语言中大致相似, 第一个参数是加了 @ 的字符串, 后面的参数是用于替换占位符的;
占位符说明 :
- %d,十进制整数, 正数无符号, 负数有 “-” 符号;
- %o : 八进制无符号整数, 没有 0 前缀
- %x : 十六进制无符号整数, 没有 0x 前缀
- %u : 十进制无符号整数
- %c : 单个字符输出
- %s : 输出字符串
- %f : 以小数形式输出浮点数, 默认 6 位小数
- %e : 以指数形式输出浮点数, 默认 6 位小数
- %g : 自动选择 %e 或者 %f 各式
- %p : 输出十六进制形式的指针地址
- %@ : 输出 Object-C 对象
NSNumber 和 NSInteger
参考博客:
https://www.jianshu.com/p/2abaedc8e8a4
NSInteger 与 NSNumber :
NSInteger是OC基本类型,NSNumber是OC的一个对象。
NSInteger是基本类型,就可以直接:
NSInteger myInt = 777;
NSNumber所拥有的类方(部分)
// 根据基本数据类型构建NSNumber对象
+ (NSNumber*)numberWithChar: (char)value;
+ (NSNumber*)numberWithInt: (int)value;
+ (NSNumber*)numberWithFloat: (float)value;
+ (NSNumber*)numberWithBool: (BOOL) value;
+ (NSNumber*)numberWithLong: (long) value;
// 例子:
NSNumber* myNumber = [NSNumber numberWithLong:0xabcdef];
//获取对象的整型值
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (BOOL)boolValue;
- (NSString*)stringValue;
// 例子:
int myInt = [intNumber intValue];
NSInteger 与 int:
NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。
32位系统NSInteger是一个int,即32位,但当时64位系统时,NSInteger便是64位的。
苹果的官方文档推荐使用NSInteger
NSArray 和 NSMutableArray
参考博客:
https://www.cnblogs.com/zhang-kiwi/p/5009017.html
在OC中:
NSArray是不可变数组,初始化后不能修改数组内容。
NSMutableArray是可变数组,可以随时修改数组内容(增加、删除、修改)。
NSArray常用的方法:
// NSArray 数组创建
NSArray *arr1 = @[@"11",@"22",@"33"];
// 1、计算数组元素的个数: count
NSUInteger cout = [arr1 count];
NSLog(@"cout = %ld",cout);
// 2、objectAtIndex:取得对应下标的元素
// 方式一:
id obj = [arr1 objectAtIndex:0];
NSLog(@"obj:%@",obj);
// 方式二:
id obj1 = arr1[1];
NSLog(@"obj1:%@",obj1);
// 3、containsObject 判断数组是否存在某个对象
BOOL result = [arr1 containsObject:@"11"];
if (result) {
NSLog(@"数组存在这个对象");
}
// 4、indexOfObject :取得对象所在数组的下标位置
NSUInteger index = [arr1 indexOfObject:@"ww"];
NSLog(@"index = %ld",index);
// 5、取得数组的最后一个元素
id obj2 = [arr1 lastObject]; //取得数组的最后一个元素
NSLog(@"obj2:%@",obj2);
id obj3 = [arr1 firstObject];// 取得数组的第一个元素
NSLog(@"obj3:%@",obj3);
// 6、以某个字符串的截取原来字符串,实质就是删掉这“某个”字符串:componentsSeparatedByString,返回一个数组
NSString *s1 = @"44*55*66";
NSArray *arr2 = [s1 componentsSeparatedByString:@"*"];
NSLog(@"arr6:%@",arr2);
// 7、将数组中元素用某个字符串拼接起来:componentsJoinedByString,返回一个字符串类型
NSString *newString = [arr2 componentsJoinedByString:@","];
NSLog(@"newString :%@",newString);
NSMutableArray 常用的方法:
// NSMutableArray 数组创建
NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects:@"77",@"88",@"99",@"00" ,nil];
// 1、数组添加元素
// 给数组添加元素:addObject
[mArr addObject:@"aa"];
NSLog(@"mArr :%@",mArr);
// 添加某个数组里的元素:addObjectsFromArray
[mArr addObjectsFromArray:mArr];
NSLog(@"mArr:%@",mArr);
// 2、数组插入元素 :
// insertObject 数组插入某个元素到指定位置
[mArr insertObject:@"bb" atIndex:1];
NSLog(@"mArr:%@",mArr);
// 3、replaceObjectAtIndex 用新元素替换某个位置的元素
[mArr replaceObjectAtIndex:3 withObject:@"xx"];
NSLog(@"mArr:%@",mArr);
// 4、exchangeObjectAtIndex 交换两个元素的位置
[mArr exchangeObjectAtIndex:1 withObjectAtIndex:2];
NSLog(@"mArr:%@",mArr);
// 5、数组元素删除
// 删除指定范围的元素:removeObjectsInRange
NSRange rang = {1,2};
[mArr removeObjectsInRange:rang];
NSLog(@"mArr:%@",mArr);
// 删掉指定的所有元素:removeObject
[mArr removeObject:@"99"];
NSLog(@"mArr:%@",mArr);
// 删除指定位置的元素:removeObjectAtIndex
[mArr removeObjectAtIndex:1];
NSLog(@"mArr:%@",mArr);
// 删除最后一个元素:removeLastObject
[mArr removeLastObject];
NSLog(@"mArr:%@",mArr);
// 删除数组的所有元素,数组没有删除:removeAllObjects
[mArr removeAllObjects];
NSLog(@"mArr:%@",mArr);
数组遍历的三个方法:
// 1、普通遍历
NSArray *array = @[@"1",@"2",@"3",@"4"];
for (int i = 0; i < array.count; i++) {
NSString *string = [array objectAtIndex:i];
NSLog(@"第%d个:%@",i,string);
}
// 2、快速遍历
for (id string in array) { // for in
NSLog(@" %@",string);
}
// 3、block 遍历
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"第%ld个:%@",idx,obj);
}];
NSString
参考博客:
https://www.cnblogs.com/smithjackyson/p/5058467.html
字符串通常都是每一门语言较为重要的常用类,OC中我们普遍使用的是 NSString
NSString
的创实例方法如下:
// 实例方法
// 格式化生成一个字符串对象
- (instancetype)initWithFormat:(NSString *)format;
// 根据给定的字符串生成一个字符串对象
- (instancetype)initWithString:(NSString *)aString;
// UTF-8编码格式的C字符串生成一个字符串对象
- (instancetype)initWithUTF8String:(const char *)bytes;
// 根据给定的C字符串(无编码)和字符串长度生成一个字符串对象
- (instancetype)initWithCharacters:(const unichar *)characters length:(NSUInteger)length;
// 例子
NSString *string1 = @"hello";
NSString *string2 = [NSString stringWithFormat:@"hello"];
NSString *string3 = [[NSString alloc] initWithFormat:@"hello"];
NSString
的常用方法如下:
- (NSString *)stringByAppendingFormat:(NSString *)format;
// 在字符串后面添加格式化字符串
- (NSString *)substringFromIndex:(NSUInteger)anIndex;
// 截取子字符串(从anIndex位置字符(包含)开始到字符串结束)
- (NSString *)substringToIndex:(NSUInteger)anIndex;
// 截取子字符串(从0位置截取长度为anIndex个字符的字符串)
- (BOOL)containsString:(NSString *)str;
// 判断字符串里是否包含str字符串
- (BOOL)hasPrefix:(NSString *)aString;
// 字符串是否含有aString字符串前缀
- (BOOL)hasSuffix:(NSString *)aString;
// 字符串是否含有aString字符串后缀
- (BOOL)isEqualToString:(NSString *)aString;
//判断字符串和aString是否相等
- (NSRange)rangeOfString:(NSString *)aString;
//查找aString字符串在调用方法的字符串中的范围(起始位置和长度)
- (NSString *)stringByReplacingOccurrencesOfString:(NSString*)target withString:(NSString *)replacement;
// 将字符串中的子字符串target替换成replacement字符串
- (NSString *)stringByReplacingCharactersInRange:(NSRange)range withString:(NSString *)replacement;
// 将字符串中range指定的范围的字符串替换为replacement字符串
- (NSComparisonResult)compare:(NSString *)aString;
// 比较字符串和astring字符串
- (NSString *)stringByAppendingString:(NSString *)aString;
//在字符串后面添加字符串aString
- (NSString *)substringWithRange:(NSRange)aRange;
//截取子字符串(范围由aRange中的location和length决定)NSRange用NSMakeRange(NSUInteger loc, NSUInteger len)方法得到
- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;
// 将字符串按照给定的字符串进行截取,将截取的多段字符串放入数组中
- (unichar)characterAtIndex:(NSUInteger)index;
// 取得字符串第index个位置(从0开始)的字符
- (void)getCharacters:(unichar *)buffer;
//将字符串的内容字符存储到缓存buffer中
- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange;
//将range指定的范围的字符存储到buffer中
工作记录
算法实现
螺旋矩阵 :
#import <Foundation/Foundation.h>
@interface MyObject : NSObject
+(NSMutableArray*) initSpiralMatrixBySize:(NSInteger)n;
+(NSString*) spiralMatrixNSStringFormat:(NSMutableArray*)mArr;
@end
@implementation MyObject
+(NSMutableArray*) initSpiralMatrixBySize:(NSInteger)n {
NSMutableArray *mArr = [NSMutableArray arrayWithCapacity: n];
for(NSInteger i = 0; i < n; i++) {
NSMutableArray *temp = [NSMutableArray arrayWithCapacity: n];
for(NSInteger j = 0; j < n; j++) {
[temp addObject: @"0"];
}
[mArr addObject: temp];
}
NSInteger size = n;
NSInteger x = 0, y = -1;
NSInteger value = 1;
while(size > 0) {
for(NSInteger i = 1; i <= size; i++) {
y++;
[[mArr objectAtIndex: x] replaceObjectAtIndex: y withObject: [NSNumber numberWithInteger: value]];
value++;
}
for(NSInteger i = 1; i <= size-1; i++) {
x++;
[[mArr objectAtIndex: x] replaceObjectAtIndex: y withObject: [NSNumber numberWithInteger: value]];
value++;
}
if(size > 1) {
for(NSInteger i = 1; i <= size-1; i++) {
y--;
[[mArr objectAtIndex: x] replaceObjectAtIndex: y withObject: [NSNumber numberWithInteger: value]];
value++;
}
for(NSInteger i = 1; i <= size-2; i++) {
x--;
[[mArr objectAtIndex: x] replaceObjectAtIndex: y withObject: [NSNumber numberWithInteger: value]];
value++;
}
}
size -= 2;
}
return mArr;
}
+(NSString*) spiralMatrixNSStringFormat:(NSMutableArray*)mArr {
NSInteger m = [mArr count];
if(m <= 0) {
NSString* errorString = @"SpiralMatrix Size Error!\n";
return errorString;
}
NSInteger n = [[mArr objectAtIndex: 0] count];
if(m != n) {
NSString* errorString = @"SpiralMatrix Size Error!\n";
return errorString;
}
NSString* myString = @"\n";
for(NSInteger i = 0; i < n; i ++){
for(NSInteger j = 0; j < n; j++){
NSNumber* temp = [[mArr objectAtIndex: i] objectAtIndex: j];
myString = [myString stringByAppendingString: [temp stringValue]];
myString = [myString stringByAppendingString: @" "];
}
myString = [myString stringByAppendingString:@"\n"];
}
return myString;
}
@end
int main(int argc, char *argv[]) {
NSInteger n;
NSLog(@"Enter the size of spiral matrix(size > 0):");
scanf("%i", &n);
if(n < 0) {
NSLog(@"size %i is invalid.", n);
}
else {
NSMutableArray *result = [MyObject initSpiralMatrixBySize:n];
NSLog(@"%@", [MyObject spiralMatrixNSStringFormat:result]);
}
return 0;
}
总结
这一周比较忙碌,一开始安排在周六的实训课程因为一个综合实验课程讲座给调整到了周日,在各科课程开始布置作业的同时,自己还要准备暑期实习的笔试和面试, 这个周末就相当于没有休息了。
学习IOS给我的第一感觉就是新颖,从操作系统上的各种骚操作到OC语法的骚操作,都跟之前学过的各种语言语法有较大的差异。这周的实训课程也是学期的第一堂课,所以自己打算先以熟悉为主,熟悉Mac OS的系统操作,熟悉X-Code的项目结构,熟悉OC的语法。
万事开头难,尝试一件新的事物总是困难的,OC的语法就很特殊,在课堂上,我甚至不知道如何去完成字节跳动老师布置的小任务,算法是清晰,讲解也很好,但还没有太多的时间去接触,因此coding起来就显得格格不入,比如说基本数据类型的使用、对象方法的调用等等。课后自然也是努力地去学习和掌握一些基础的OC语法和用法,例如比较重要的数据类型、NSString、NSArray、NSMutableArray等。后续还要继续学习OC的语法,在项目中不断地去熟悉运用。
当然最困难的问题还是设备的问题,由于设备数量不够,没办法人手一台,因此智能安排通知去实验室找郑老师要Mac主机,本身打算周二去实验室操作一下,结果因为学校研究生复试,导致教室被征用,也没法实现了。好在网上找到一个在线OC的编译运行环境,因此也可以稍微学习一下。至于模板项目,争取找时间去实验室熟悉、理解、学习一下。