1.NSSet的用法

①NSSet是一种无序集合,基于hash实现,可以在线性时间复杂度内查找某个元素,如果要让元素有序,应当使用NSOrderedSet,要让集合可变,与NSArray类似,使用NSMutableSet和NSMutableOrderedSet即可。

②从Set中取出元素只能用anyObject随机取,NSSet被系统用于存放用户的触摸点。

③Set的另一个特点是集合内元素唯一,重复向集合内添加同一元素是无效的。如果要实现集合中有多个重复元素,应该使用NSCountedSet。

④NSCountedSet本身是可变的,其元素重复原理是对元素个数进行计数,而不是真正的重复,调用方法countForObject:可以得到某个元素的个数。

2.在自定义的类内实现用下标访问成员变量

我们知道字典可以通过key拿到数据,如果类实现了字典的两个方法,借助于KVC可以实现下标访问,下面用一个例子来说明。

按照CookBook中的例子,一个Person类有firstName和lastName两个成员,我们借助于键值来访问,需要实现两个方法:

- (id)objectForKeyedSubScript:(id<NSCopying>)paramKey;
- (void)setObject:(id)paramObject forKeyedSubscript:(id<NSCopying>)paramKey;

苹果官方也许并不推荐这种做法,因此默认是没有提示的,有个技巧是先让类继承NSDictionary,然后可以根据提示打出这两个方法,然后再替换为NSObject或者其他基类。

这两个方法一定要写在头文件里,然后就可以像字典那样访问成员变量了,如果不写在头文件,编译器会报错。

下面是完整的代码:

1.头文件

#import <Foundation/Foundation.h>

extern NSString *const kFirstNameKey;
extern NSString *const kLastNameKey; @interface Person : NSObject @property (nonatomic, copy) NSString *firstName;
@property (nonatomic, copy) NSString *lastName; - (id)objectForKeyedSubScript:(id<NSCopying>)paramKey;
- (void)setObject:(id)paramObject forKeyedSubscript:(id<NSCopying>)paramKey; @end

2.m文件,注意对键值的安全处理

#import "Person.h"

NSString *const kFirstNameKey = @"firstName";
NSString *const kLastNameKey = @"lastName"; @implementation Person - (id)objectForKeyedSubScript:(id<NSCopying>)paramKey{ NSObject<NSCopying> *keyAsObject = (NSObject<NSCopying> *)paramKey;
if ([keyAsObject isKindOfClass:[NSString class]]) {
NSString *keyStr = (NSString *)paramKey;
if ([keyStr isEqualToString:kFirstNameKey] || [keyStr isEqualToString:kLastNameKey]) {
return [self valueForKey:keyStr];
}
} return nil; } - (void)setObject:(id)paramObject forKeyedSubscript:(id<NSCopying>)paramKey{ NSObject<NSCopying> *keyAsObject = (NSObject<NSCopying> *)paramKey;
if ([keyAsObject isKindOfClass:[NSString class]]) {
NSString *keyStr = (NSString *)paramKey;
if ([keyStr isEqualToString:kFirstNameKey] || [keyStr isEqualToString:kLastNameKey]) {
[self setValue:paramObject forKey:keyStr];
}
} } - (NSString *)description{ return [NSString stringWithFormat:@"%@ %@",_firstName,_lastName]; } @end

接下来我们就可以直接通过key访问成员变量了,之所以重写了description方法,就是为了打印出成员,来验证key可以设定值。

验证代码如下:

Person *p = [Person new];
p[kFirstNameKey] = @"Tim";
p[kLastNameKey] = @"Cook";
NSLog(@"%@",p);

打印如下:

2015-08-31 18:19:44.742 iOS CookBookLearn[2825:36849] Tim Cook

可以验证我们实现了通过key来访问成员变量。

3.alertView判断按钮的清晰写法

因为alertView在代理方法被调用时传入的是alertView本身和buttonIndex,一个常用的判断是直接判断buttonIndex等于几,这样对于大项目来说会提高交流成本,使得程序的可读性下降,一个比较好的办法是通过alertView的buttonTitleAtIndex:方法拿到标题,然后通过标题判断。

4.对于默认宽高的控件,设置frame时width和height直接写0即可。

5.DatePicker的成员属性minimumDate和maximumDate可以设置日期拾取区间限制。

6.在iOS7和以后,UISlider的track images的宽度被限制为1,因此使用track image来自定义UISlider意义不大,应该使用minimumTrackTintColor和maximumTrackTintColor来设置轨道颜色。Slider的thumb宽高均为23,这也决定了Slider的默认高度为23不能改变。

7.通过XIB加载视图,使用initWithNibName:bundle:方法,默认的bundle直接填nil即可。

iOS7 CookBook精彩瞬间(二)NSSet、通过Subscript访问类成员等的更多相关文章

  1. iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity

    1.基本使用 UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建: [[UIActivityViewController a ...

  2. iOS7 CookBook精彩瞬间(一)property、selector细节、__unused

    1.我们常常使用nonatomic,很多人只知道它的效率较高,却不知道其含义,其含义是非线程安全的,也就是说多线程修改时不加锁,可能出现多个线程先后修改而成为脏数据的情况. 2.unsafe_unre ...

  3. C++入门经典-例7.1-对象之访问类成员

    1:建立一个类CPerson. (1)在person.h文件中代码: class CPerson { public: //数据成员 int m_iIndex; ]; short m_shAge; do ...

  4. “全栈2019”Java第七十二章:静态内部类访问外部类成员

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. p2p-tunnel 打洞内网穿透系列(二)TCP转发访问内网共享文件夹

    系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...

  6. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  7. 我也来写:数据库访问类DBHelper

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

  8. VC6.0中友元函数无法访问类私有成员的解决办法

    举个例子: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #inclu ...

  9. 我也来写:数据库访问类DBHelper(转)

    一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...

随机推荐

  1. 51 nod 1681 公共祖先 (主席树+dfs序)

    1681 公共祖先 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另 ...

  2. Codeforces Round#433 简要题解

    来自FallDream的博客,未经允许,请勿转载,谢谢. 我的号自从几个月前姿势水平过低疯狂掉分之后就没动过了  突然想上点分  就打了一场Div1  没想到打到了rank5  一发上橙了,可还行. ...

  3. [UOJ UNR #2]积劳成疾

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...

  4. 使用python+requests+unittest实现接口自动化测试

    这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下. 一.整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用. Common:公共方法:主要放 ...

  5. java9学习之模块化

    截止到目前JDK的版本已经更新到10了,虽然java9的生命周期才半年,但是我认为这个版本带来的变革是不可磨灭的,它是第一次深层次的针对架构以及依赖上的革新.下面我们就来学习一下. 一.模块化项目构建 ...

  6. SQL Server2008 安装失败后的解决办法

    SQL Server2008 安装不容易成功,或许用这种方法可能会安装成功.     首先,把电脑上的SQL Server2008 卸载干净 怎么卸载干净? 1.找到控制面板-->卸载程序--& ...

  7. python 程序中调用go

    虽然python优点很多,但是有一个致命的缺点就是运行速度太慢,那么python程序需要一些计算量比较大的模块时一般会调用c或者c++的代码来重写,但是c/c++编写代码代价太高,耗费太多的人力.那么 ...

  8. 用js实现排列组合

    在leetcode上看到一个题,代码实现排列组合的. 记得大学上课时候,就用c写过,现在用js试试,顺便看看耗时. 先看看3的阶乘: function permute(temArr,testArr){ ...

  9. 77. Combinations(medium, backtrack, 重要, 弄了1小时)

    Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...

  10. sql 复习练习

          一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- ...