可变与不变的对象 |
一览 |
种类 |
不变类 |
可变类 |
数组 |
NSArray |
NSMutableArray |
数据data |
NSData |
NSMutableData |
字典(哈希表) |
NSDictionary |
NSMutableDictionary |
集合 |
NSSet |
NSMutableSet |
字符串 |
NSString |
NSMutableString |
带属性的字符串 |
NSAttributedString |
NSMutableAttributedString |
文字集合 |
NSCharacterSet |
NSMutableCharacterSet |
索引集合 |
NSIndexSet |
NSMutableIndexSet |
可变类是不变类的子类,继承可变类的所有方法
|
从不变类生成可变类 |
- (id) mutableCopy;
定义于NSObject
Sample *test = [[Sample alloc] init];
MutableSample *temp = [test mutableCopy];
|
|
|
字符串类 |
简介 |
字符码: Unicode
NSString 生成了无法更改
Foundation/NSString.h
|
NSString主要方法 |
(1)
Unicode字符串的操作
|
注: unichar是Unicode表现的一个字符的类型,不同于char
便利构造函数: 先自动呼出alloc的
- (id) initWithUTF8String: (const char*) bytes;
便利构造函数:
+ (id) stringWithUTF8String: (const char*) bytes;
|
用和C一样以'\0'结尾的字符串生成 |
- (__strong const char *) UTF8String; |
返回编码为UTF-8的C字符串指针 |
- (NSUInteger) length; |
返回字符串长度
不同于C,不能用来计算需要的大小
(# TODO: check [?])
|
- (unichar) characterAtIndex: (NSUInteger) index; |
获取第index个的Unicode字符 |
- (id) initWithCharacters: (const unichar *) characters length: (NSUInteger) length
便利构造函数:
+ (id) stringWithCharacters: length:
|
生成length长的以characters重复的字符串 |
- (void) getCharacters: (unichar *) buffer range: (NSRange) aRange |
把aRange指定的范围的字符串复制到buffer
注: 不会自动加'\0'
NSRange 开始位置和长度的结构体
buffer长度必须够
|
|
|
|
(2)
指定字符编码的变换
|
NSStringEncoding类型 |
指定字符码
如
NSASCIIStringEncoding
|
7位的ASCII字码 |
NSUTF8StringEncoding
|
Unicode字符的8位字码
UTF-8
|
NSMaxOsRomanStringEncoding
|
日语的8位EUC字码 |
NSShiftJISStringEncoding |
日语的8位shiftJIS字码 |
|
|
|
- (id) initWithCString: (const char *) nullTerminatedCString
encoding: (NSStringEncoding) encoding
便利构造函数:
+ (id) stringWithCString: encoding:
注: encoding表示data的生成方法,生成的对象的生成方法是Unicode
|
通过指定编码的以'\0'结尾的字符串生成
|
- (__strong const char *) cStringUsingEncoding: (NSStringEncoding) encoding |
指定字码来转换,无法转换会抛出例外
getCString:MaxLength:encoding: 可以直接放到准备好的内存里
|
- (id) initWithData: (NSData *) data encoding: (NSStringEncoding) encoding
注: encoding表示data的生成方法,生成的对象的生成方法是Unicode
|
通过以encoding字码写的data来生成
类似的有
initWithBytes:length:encoding:
|
- (NSData *) dataUsingEncoding: (NSStringEncoding) encoding
只获取长度:
lengthOfBytesUsingEncoding:
|
把受体的字符串通过encoding编码后返回NSData,
无法转换返回nil
|
- (BOOL) canBeConvertedToEncoding: (NSStringEncoding) encoding |
能不能被指定的字码转换
可以用
availableStringEncodings来查看当前环境可用的encoding
|
URL字符化
- (NSString *) stringByAddingPercentEscapesUsingEncoding: (NSStringEncoding) encoding
String化
stringByReplacingPercentEscapesUsingEncoding:
|
把受体根据encoding来%化,用在URL的字符串表达上
都在Foundation/NSURL.h
|
|
|
|
(3)
根据格式生成字符串
|
格式规则 |
格式规则和printf()里的一样
不同:
可用%@, NSString, 对象的description(NSString)
格式字符串也是NSString
注意: 用格式生成NSString时,格式修饰符的对象不会自动转型
|
- (id) initWithFormat: (NSString *) format, ...
便利构造函数:
stringWithFormat:
|
根据格式生成字符串
可变长度的参数, 最后加...
# TODO: Supply [10.2 可变长度的参数]
|
|
|
|
(4)
对比
|
NSComparisionResult |
enum _NSComparisionResult {
NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending
};
typedef NSInteger NSComparisionResult;
相同返回NSOrderedSame, 小返回NSOrderedDescending, 大返回NSOrderedAscending
|
- (NSComparisionResult) compare: (NSString *) aString |
字符串的比较, aString不能为nil
只是比较是否相同的话可用
- (BOOL) isEqualToString: (NSString *) aString
|
- (NSComparisionResult) caseInsensitiveCompare: (NSString *) aString |
无视大小写的比较
其他方法来比较的话用:compare:option:
|
- (NSComparisionResult) localizedStandardCompare: (NSString *) aString |
Mac的Finder里文件名排序相同的方法来比较 |
- (BOOL) isEqualToString: (NSString *) aString |
与指定NSString是否相同 |
- (BOOL) hasPrefix: (NSString *) aString
|
开头是否和aString相同(是否有指定前缀) |
- (BOOL) hasSuffix: (NSString *) aString |
结尾是否与aString相同 |
commonPrefixWithString:options: |
从开头取出相同的字符串 |
|
|
|
|
|
(5)
连接
|
- (NSString *) stringByAppendingString: (NSString *) astring |
把aString连接在最后 |
- (NSString *) stringByAppendingFormat: (NSString *) format, ... |
把根据格式生成的字符串连接在最后 |
|
|
|
|
|
(6)
子字符串
|
😂Objective-C都tm什么鬼,怎么啥都给命个怪名啊😂我他娘的意大利炮呢😂
- (NSString *) substringToIndex: (NSUInteger) anIndex |
获取从开头到anIndex-1位置的字符串 |
- (NSString *) substringFromIndex: (NSUInteger) anIndex |
获取从anIndex到结尾的字符串 |
- (NSString *) substringWithRange: (NSRange) aRange |
获取aRange指定范围的字符串 |
NSRange的说明 |
typedef struct _NSRange {
NSUInteger location; // 开头
NSUInteger length; //长度
} NSRange;
|
|
|
|
(7)
搜索与置换
|
- (NSRange) rangeOfString: (NSString *) aString |
搜索指定字符串在受体内的位置
不存在的话返回的location是NSNotFound, length为0
忽视大小写等用
rangeOfString:options:
|
搜索时支持正规表现, option: NSRegularExperssionSearch |
[str rangeOfString: @"[0-9]{3}+-[0-9]{4}" option: NSRegularExpressionSearch];
|
- (NSRange) lineRangeForRange: (NSRange) aRange |
指定行与位置,返回实际在字符串里的位置
@"第1行\n第2行\n第3行\n第4行\n"这样的
代表行的结尾的字符
\r或0x0d |
CR, Mac OS的行末 |
\n或0x0a |
LF, Unix类的行末 |
\r\n |
CRLF, Windows的行末 |
U+2028 |
Unicode的行末 |
U+2019 |
Unicode的段落结尾 |
|
|
|
- (NSString *) stringByReplacingCharactersInRange: (NSRange) range withString: (NSString *) replacement |
指定范围的字符用replacement来代替 |
- (NSString *) stringByReplacingOccurencesOfString: (NSString *) target withString: (NSString *) replacement |
用replacement替代所有的target |
|
|
|
|
|
|
|
|
|
|
|
|
|
(8)
大小写
|
- (NSString *) lowercaseString |
全大写 |
- (NSString *) uppercaseString |
全小写 |
- (NSString *) capitalizedString |
首字母大写,其他小写 |
|
|
|
(9)
数值的转换
|
doubleValue
floatValue
intValue
integerValue
boolValue 以Y, y, T, t开头或开头是非零数字(001, 1, 010都算非零数字)的返回YES
|
(10)
路径的操作
|
位置 Foundation/NSPathUtilities.h
参照根路径 NSHomeDirectory()
例: /github/mySample/math.m
- (NSString *) lastPathComponent |
获取最后一个路径元素
例子里的math.m
|
- (NSString *) stringByAppendingPathComponent: (NSString *) aStr |
在最后添加指定的路径元素 |
- (NSString *) stringByDeletingLastPathComponent |
删除最后一个路径元素
如果删除后是根路径,删除多余的'/'
|
- (NSString *) pathExtension |
获取文件后缀,没有后缀的返回空字符串
例里的"m"
|
- (NSString *) stringByAppendingPathExtension: (NSString *) aStr |
在最后增加文加后缀
不要'.', 自动添加
|
- (NSString *) stringByDeletingPathExtension |
删除后缀与'.'
没有后缀的不改动
|
- (BOOL) isAbsolutePath |
如果是绝对路径返回YES |
+ (NSString *) pathWithComponents: (NSArray *) components |
以数组元素来创建路径
要绝对路径的话第一个元素 @"\"
末尾加\的话最后一个元素 @""
|
- (NSArray *) pathComponents |
把路径分解成路径元素的数组
绝对路径第一个 @"\"
最后带\的最后一个@""
|
- (NSString *) stringByExpandingTildeInPath |
开头是~/...或者~name/...的,把第一个/前换成根路径
不是的不变
|
- (NSString *) stringByAbbreviatingWithTildeInPath |
开头是根路径的换成~ |
- (__strong const char *) fileSystemRepresentation
放入aStr内:
- (BOOL) getFileSystemRepresentation:maxLength:
|
用文件系统使用的字码来转换成C字符串
|
|
|
|
|
|
|
|
(11)
文件的输入输出
|
# TODO: Supply [s18 NSError]
- (id) initWithContentsOfFile: (NSString *) path
encoding: (NSStringEncoding) enc
error: (NSError **)error
便利的构造函数:
stringWithContentsOfFile:encoding:error:
|
从指定的path以enc字码读取文件并写入受体
如果无法读取, 释放受体返回nil, error指向详细信息
|
- (id) initWithContentsOfFile: (NSString *) path
usedEncoding: (NSStringEncoding) enc
error: (NSError **) error
|
和上一个一样,但是字码自动判定并且放入enc里 |
- (BOOL) writeToFile: (NSString *) path
atomically: (BOOL) useAuxiliaryFile
encoding: (NSStringEncoding) enc
error: (NSError **) error
|
把受体按enc转码写入path指定的文件里, 成功返回YES
atomically为YES的话,写在临时文件写入,成功后重命名为原文件,
不损坏原文件
失败的话返回NO, error指向错误详细信息
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(12)
其他
|
- (id) init
便利的构造函数:
string
|
生成空字符串
用在NSMutableString才有实际意义(因为NSString一旦生成不能改变)
|
- (id) initWithString: (NSString *) aString |
根据aString生成字符串
参数也可以是NSMutableString的实例, 可变生成不变
|
- (NSString *) description |
NSObject处定义
NSString处为返回self, 也就是自己的字符串
|
- (id) propertyList |
# TODO: Supply [s13-3 propertyList]
|
- (NSArray *) componentsSeparatedByCharactersInSet:
(NSCharacterSet *) sep
|
以sep指定的字符集合内部的字符为分割符分割字符串并返回数组 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NSMutableString |
NSString的子类
生成 |
- (id) initWithCapacity: (NSUInteger) capacity
便利的构造函数:
stringWithCapacity:
|
指定容量
容量不够了会自动增加,所以不用严密的值
|
|
|
|
|
|
|
|
修改 |
- (void) appendString: (NSString *) aString |
在末尾插入aString |
- (void) appendFormat: (NSString *) format, ... |
根据格式生成字符串并插入在最后 |
- (void) insertString: (NSString *) aString
atIndex: (NSUInteger) loc
|
把aString插入到loc位置 |
- (void) deleteCharactersInRange: (NSRange) aRange |
删除aRange指定范围的字符串 |
- (void) setString: (NSString *) aString |
复制aString |
- (void) replaceCharactersInRange: (NSRange) aRange
withString: (NSString *) aString
|
用aString替换aRange指定范围的字符串 |
- (NSUInteger) replaceOccurencesOfString: (NSString *) target
withString: (NSString *) replacement
options: (NSStringComparisionOptions) opts
range: (NSRange) searchRange
|
searchRange范围内所有target都用replacement来替换
options可以指定NSRegularExperssionSearch来使用正则表达式
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
数据类 |
简介 |
处理比特列
Foundation/NSData.h
|
(1)
生成
|
- (id) initWithBytes: (const void *) bytes length: (NSUInteger) length
便利的构造函数:
dataWithBytes:length:
|
以bytes为起点长度length的数据来初始化
是copy,不是原来对象
|
- (id) initWithBytesNoCopy: (void *) bytes
length: (unsigned) length
freeWhenDone: (BOOL) flag
便利的构造函数:
dataWithBytesNoCopy:length:freeWhenDone:
|
以bytes为起点长度length的数据来初始化
不是copy,是原来对象
flag: YES 自动释放, bytes必须有malloc等生成
NO 手动释放
|
- (id) initWithData: (NSData *) aData
便利的构造函数:
dataWithData:
|
从aData生成
aData可以使NSMutableData的实例, 从可变生成不变
|
+ (id) data
相当于 [[NSData alloc] init];
|
生成长度0的空的NSData实例
主要用于NSMutableData, 对应init
|
|
|
|
(2)
获取
|
- (NSUInteger) length |
获取比特列长度 |
- (const void *) bytes |
获取比特列开头的指针 |
- (void) getBytes: (void *) buffer length: (NSUInteger) length
|
获取开头开始长度length的比特列
|
- (NSData *) subdataWithRange: (NSRange) range
- (void) getBytes: (void) buffer range: (NSRange) range
|
获取range范围的数据
把range范围的数据写入buffer
|
- (NSRange) rangeOfData: (NSData *) dataToFind
options: (NSDataSearchOptions) mask
range: (NSRange) searchRange
|
在searchRange范围内寻找dataToFind,找到
返回NSRange类数据。
NSDataSearchOptions可以指定逆序查找等
dataToFind不可以是nil
|
|
|
|
|
|
|
|
(3)
比较
|
- (BOOL) isEqualToData: (id) anObject |
受体的data和anObject内容一致,长度一致时返回YES |
|
|
|
(4)
文件输入输出
|
- (NSString *) description |
把data的内容以property list形式生成字符串并返回 |
- (id) initWithContentsOfFile: (NSString *) path
options: (NSUInteger) mask
error: (NSError **) errorPtr
便利的构造函数:
dataWithContentsOfFile:options:error:
|
读取path文件,作为比特列来初始化
失败的话受体自动释放,变成nil, errorPtr装入详细错误信息
mask: 是否使用虚拟内存等? # TODO: check [mask内容?]
|
- (id) initWithContentsOfFile: (NSString *) path
便利的构造函数:
dataWithContensOfFile:
|
上一个的第二,三参数自动指定为0, NULL |
- (BOOL) writeToFile: (NSString *) path
atomically: (BOOL) flag
|
把受体的比特列写入path指定的文件里,成功返回YES
flag: YES 写入在临时文件,成功后重命名为指定文件 (失败不影响原文件)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NSMutableData |
NSData的子类
Foundation/NSData.h
(1)
生成
|
- (id) initWithCapacity: (NSUInteger) capacity
便利的构造函数:
dataWithCapacity
|
指定容量来生成, 不够了自动增加
也可以直接init, 也就是容量为0
|
- (id) initWithLength: (NSUInteger) capacity
便利的构造函数:
dataWithLength:
|
指定比特列长度来生成, 全部比特位用0来填 |
|
|
|
|
|
|
|
(2)
获取
|
- (void *) mutableBytes |
获取比特列
长度为0时返回NULL
和bytes的不同在于获取的比特列可以被改写
|
|
|
|
|
|
(3)
增加
|
- (void) appendData: (NSData *) otherData |
在受体的比特列末尾添加上otherData(copy) |
- (void) appendBytes: (const void *) bytes
length: (NSUInteger) length
|
复制bytes开头到指定长度的比特列到受体末尾
# TODO: check [长度超过bytes时候是什么处理]
|
|
|
|
(4)
变更
|
- (void) replaceByBytesInRange: (NSRange) range
withBytes: (const void *) replacementBytes
length: (NSUInteger) replacementLength
|
用replacementBytes替换range指定的范围
replacementLength是替换的新字符串的长度
range的长度和replacementLength不同的话,比特列长度自动变化。
range的长度为0时为location后插入
|
- (void) replaceBytesInRange: (NSRange) range
withBytes: (const void *) bytes
|
用bytes替换range指定范围的数据
相当于上一个的replacementLength和range的length相同的情况
|
- (void) setData: (NSData *) aData |
用aData的内容设置受体 |
- (void) resetBytesInRange: (NSRange) range |
用0重置指定范围的比特列 |
|
|
|
(5)
改变比特列长度
|
- (void) increaseLengthBy: (NSUInteger) extraLength |
增加指定长度
增加部分都自动用0填埋
|
- (void) setLength: (NSUInteger) length |
设定比特列长度为length
拉伸的时候,增加部分自动用0填埋
|
|
|
|
|
|
|
|
|
|
|
|
|
数组类 |
NSArray |
简介 |
数组元素可以是不同的类的实例,不能有nil
Foundation/NSArray.h
|
(1)
生成与初始化
|
+ (id) array
对应init
|
生成空数组
NSMutableArray才有用
|
+ (id) arrayWithObject: (id) anObject |
生成包含参数指定的一个元素的数组 |
- (id) initWithObjects: (id) firstObj, ...
便利的构造函数:
arrayWithObjects:
|
生成以参数指定的对象为元素的 数组
参数最后要有nil, xcode里自动添加了
|
- (id) initWithObjects: (const id *) objects
count: (NSUInteger) count
便利的构造函数:
arrayWithObjects:count:
|
以count个objects来生成数组
object: 包含对象的数组,可以使C语言的数组
|
- (id) initWithArray: (NSArray *) anArray
便利的构造函数:
arrayWithArray:
|
用NSArray或NSMutableArray来生成
可以用可变生成不变
|
- (id) initWithArray: (NSArray *) array
coptItems: (BOOL) flag
|
和上一个一样
flag: YES array的copy来生成
NO array的指针来生成
|
|
|
|
|
|
|
|
|
|
(2)
获取
|
- (NSUInteger0 count |
数组的长度 |
- (NSUInteger) indexOfObject: (id) anObject |
返回指定元素的位置
不存在的话返回NSNotFound
#define NSIntegerMax LONG_MAX
static const NSInteger NSNotFound = NSIntegerMax;
|
- (BOOL) containsObject: (id) anObject |
判断是否包含指定的元素 |
- (id) ObjectAtIndex: (NSUInteger) index |
获取指定位置的元素
index大于长度的话返回NSRangeException
|
- (id) lastObject |
返回最后一个元素
空的话返回nil
|
- (id) getObjects: (id __unsafe_unretained []) aBuffer
range: (NSRange) aRange
|
复制aRange指定范围的数组到aBuffer
aBuffer必须容量够
|
- (id) subarrayWithRange: (NSRange) range |
获取指定范围的数组 |
|
|
|
|
|
|
|
(3)
比较
|
- (BOOL) isEqualToArray: (id) anObject |
判断参数与受体是否相等
相等的定义: 数组长度相同, 相同位置的元素相同
|
- (id) firstObjectCommonWithArray: (NSArray *) otherArray |
返回受体与otherArray里第一个共通的元素 |
|
|
|
(4)
增加
|
- (NSArray *) arrayByAddingObject: (id) anObject |
在末尾增加指定的一个元素 |
- (NSArray *) arrayByAddingObjectsFromArray: (NSArray *) anArray |
在末尾增加指定的数组 |
|
|
|
(5)
排序
|
- (NSArray *) sortedArrayUsingSelector: (SEL) comparator
例
NSArray *arrayA = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", nil];
NSArray *arrayB = [arrayA sortedArrayUsingSelector: @(compare:)];
|
返回按升顺(从小到大)排列的数组
用选择器比较
comparator的结果必须是NSComparisionResult型
|
- (NSArray *) sortedArrayUsingFunction: (NSInteger(*)(id, id, void *)) comparator
context: (void *) context
比较用的函数形式: NSInteger funcName(id arg1, id arg2, void *context);
context相当于option, 如果不知道什么鬼,可以直接给nil(反正函数也是自定义的)
|
返回按升顺(从小到大)排列的数组
用函数比较, 函数形式
NSInteger funcName(id arg1, id arg2, void *context);
|
|
|
|
(6)
对元素发送信息
|
从头到位一个一个发送,至于发送的消息是否会改变整个数组,无法保证
- (void) makeObjectsPerformSelector: (SEL) aSelector |
向所有元素发送aSelector
aSelector不能有参数
|
- (void) makeObjectsPerformSelector: (SEL) aSelector
withObject: (id) anObject
|
向所有元素发送aSelector
aSelector必须只有一个id型参数
|
|
|
|
(7)
文件输入输出
|
以property list形式进行
# TODO: check [property list]
- (NSString *) description |
向每一个元素发送discription获得的内容以,分隔的字符串
例: (s1, s2, s3, s4)
|
- (NSString *) componentsJoinedByString: (NSString *) separator |
用separator为分隔符号,其他和description一样
例: (s1 | s2 | s3 | s4)
|
- (id) initWithContentsOfFile: (NSString *) aPath
便利的构造函数:
arrayWithContentsOfFile:
|
读取以property list形式保存的文件内容
生成数组
|
- (BOOL) writeToFile: (NSString *) path
atomically: (BOOL) flag
|
以property list形式写入文件
atomically: YES 失败不会损坏原文件
|
- (NSArray *) pathsMatchingExtensions: (NSArray *) filterTypes |
受体是文件名,参数是文件后缀的数组
取出filterTypes里包含的后缀的文件名,构成数组
|
|
|
|
|
|
|
|
|
NSMutableArray |
NSArray的子类
Foundation/NSArray.h
(1)
生成与初始化
|
- (id) initWithCapacity: (NSUInteger) numItems
便利的构造函数:
arrayWithCapacity:
|
生成指定容量的数组, 不够的话自动增加
生成空数组的话- (id) init或者 + (id) array
|
|
|
|
(2)
增加与置换元素
|
- (void) addObject: (id) anObject |
在末尾增加anObject
参数不能是nil
|
- (void) addObjectsFromArray: (NSArray *) otherArray |
在末尾增加指定的数组 |
- (void) insertObject: (id) anObject
atIndex: (NSUInteger) index
|
在指定位置插入元素
index必须在有效范围内
index指的是插入后该元素的位置
|
- (void) replaceObjectAtIndex: (NSUInteger) index
withObject: (id) anObject
|
用指定元素替换指定位置的元素
anObject不能为nil
|
- (void) setArray: (NSArray *) otherArray |
删除自身所有元素,用otherArray设定自己 |
- (void) exchangeObjectAtIndex: (NSUInteger) idx1
withObjectAtIndex: (NSUInteger) idx2
|
互换idx1和idx2位置的元素
|
|
|
|
(3)
删除
|
- (void) removeAllObjects |
删除所有元素 |
- (void) removeLastObject |
删除最后的元素 |
- (void) removeObjcetAtIndex: (NSUInteger) index |
删除指定位置的元素 |
- (void) removeObjectsInRange: (NSRange) aRange |
删除指定范围的元素 |
- (void) removeObject: (id) anObject |
删除与anObject相同的所有元素
相同: isEuqal: 返回YES
|
- (void) removeObjectsInArray: (NSArray *) otherArray |
删除otherArray里包含的元素 |
|
|
|
(4)
排序
|
- (void) sortUsingSelector: (SEL) comparator |
按升顺(从小到大)排列数组
用选择器比较 例:@selecter(a:b:c:)
comparator的结果必须是NSComparisionResult型
|
- (void) sortUsingFunction: (NSInteger (*) (id, id, void *)) compare
context: (void *) context
|
按升顺(从小到大)排列数组
用函数比较, 函数形式
NSInteger funcName(id arg1, id arg2, void *context);
|
|
|
|
|
|
|
|
|
|
|
|
|
高速枚举 |
范例
for (id x in group) { ... }
id obj; // 也可以在外面声明
for (obj in group) { // for...in
...
}
for (id sample in group) { //这样的sample只在循环时有效
...
}
注意: group可不可变无所谓,但是如果不可变,循环内部不可以变更(变更的话会抛出例外)
数组的话从头到尾的顺序取出
集合的话按内部逻辑(也就是不确定)
哈希表的话顺序也是按内部逻辑, 取出的是哈希值
|
枚举器
NSEnumerator
|
Foundation/NSEnumerator.h
都用for...in好了。。。这个无视
- (id) nextObject |
下一个元素
没有下一个的话返回nil
|
- (NSArray *) allObjects |
获取还没有拿出来的元素的数组
有一部分列举器没有这个方法
|
- (NSEnumerator *) objectEnumerator |
获取按顺序循环的列举器 |
- (NSEnumerator *) reverseObjectEnumerator |
获取按逆序循环的列举器 |
|
|
|
|
|
|
|
|
|
|
|
|
|
高速枚举与枚举器 |
忽视 p242 |
NSSet
集合类
|
Foundation/NSSet.h
和数组相同的很多
+ (id) set
对应 [[NSSet alloc] init];
|
生成空集合 |
- (id) initWithArray: (NSArray *) array
便利的构造函数:
setWithArray:
|
用数组来生成集合
其他省略
|
- (NSUInteger) count |
获取元素数量 |
- (NSArray *) allObjects |
把所有元素合成数组 |
- (BOOL) containsObject: (id) anObject |
是否包含指定的元素 |
- (BOOL) isEqualToSet: (NSSet *) otherSet |
是否和指定集合相等 |
- (B00L) isSubsetOFSet: (NSSet *) otherSet |
是否是指定集合的子集 |
- (BOOL) intersectsSet: (NSSet *) otherSet |
是否和指定集合有交集 |
|
|
|
NSMutableSet |
- (id) initWithCapacity: (NSUInteger) numItems
便利的构造函数:
setWithCapacity:
|
指定容量初始化
不够了会自动增加
|
- (void) addObject: (id) anObject |
增加指定元素 |
- (void) removeObject: (id) anObject |
删除指定元素 |
- (void) unionSet: (NSSet *) otherSet
- (void) intersectSet: (NSSet *) otherSet
- (void) minusSet: (NSSet *) otherSet
|
生成并集
生成交集
生成取出共有部分的集合
|
|
|
|
|
|
|
|
|
|
词典类(哈希表类) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
对数值的wrapper class |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NSURL |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|