1.项目

新建一个书签管理器的项目,能够存储书签的网址、中文名、星级、訪问量和权限信息。具有增、删、改、查和排序的功能。

2.找对象,抽象类

书签管理器,书签管理器。书签管理器……  多读几次书是不是就找到了对象。书签和管理器。书签包括网址、中文名和星级等信息。管理器里面有书签。那么我就能够抽象出两个类了。一个是书签类。一个是管理器类。

我们在书签管理器里面增、删、改、查和排序书签。在书签里面保存书签具有的属性数据。

3.对象的属性和行为分析



书签管理器的存储关系的分析:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

4.类的实现

1.书签类的实现

#import <Foundation/Foundation.h>
//书签类 存储书签详细的信息/数据
@interface BookMark : NSObject{
NSString * _url; //网址
NSString * _title; //标题
NSUInteger _stars; //星级
NSUInteger _vist; //訪问人数
char _level; //权限
}
- (void) setUrl:(NSString *)url;
- (void) setTitle:(NSString *)title;
- (void) setStars:(NSUInteger)stars;
- (void) setVist:(NSUInteger)vist;
- (void) setLevel:(char)level; - (NSString *) getUrl;
- (NSString *) getTitle;
- (NSUInteger) getStars;
- (NSUInteger) getVist;
- (char) getLevel; //构造方法 存储数据
- (instancetype)initWithUrl:(NSString *)url
withTitle:(NSString *)title
withSarts:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level; @end
#import "BookMark.h"
@implementation BookMark
- (instancetype) initWithUrl:(NSString *)url withTitle:(NSString *)title withSarts:(NSUInteger)stars withVist:(NSUInteger)vist withLevel:(char)level{
self = [super init];
if (self) {
_url = url;
_title = title;
_stars = stars;
_vist = vist;
_level = level;
}
return self;
}
- (void) setUrl:(NSString *)url{
_url = url;
}
- (void) setTitle:(NSString *)title{
_title = title;
}
- (void) setStars:(NSUInteger)stars{
_stars = stars;
}
- (void) setVist:(NSUInteger)vist{
_vist = vist;
}
- (void) setLevel:(char)level{
_level = level;
}
- (NSString *) getUrl{
return _url;
}
- (NSString *) getTitle{
return _title;
}
- (NSUInteger) getStars{
return _stars;
}
- (NSUInteger) getVist{
return _vist;
}
- (char) getLevel{
return _level;
}
@end

2.管理器类的实现

#import <Foundation/Foundation.h>
#import "BookMark.h"
//书签管理器类
@interface BookManager : NSObject{
NSMutableArray * _array;
}
- (instancetype)init;
//删除
- (void) removeBookMark:(NSString *)title;
//添加
- (void) addBookMarkWithUrl:(NSString *)url
withTitle:(NSString *)title
withStars:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level;
//改动
- (void) modifyTitle:(NSString *)title withNewTitle:(NSString *)newTitle;
//查找
- (void) searchWithTitle:(NSString *)title;
- (void) sortWithStars;
- (void) showAllBookMark;
@end
#import "BookManager.h"

@implementation BookManager

- (instancetype)init{
self = [super init];
if (self) {
_array = [[NSMutableArray alloc] init];
}
return self;
}
//添加书签
- (void) addBookMarkWithUrl:(NSString *)url
withTitle:(NSString *)title
withStars:(NSUInteger)stars
withVist:(NSUInteger)vist
withLevel:(char)level{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
NSLog(@"反复加入");
return;
}
}
//以下既能够使用构造方法也能够使用set方法
BookMark *book = [[BookMark alloc] initWithUrl:url withTitle:title withSarts:stars withVist:vist withLevel:level];
// BookMark * book = [[BookMark alloc] init];
// [book setUrl:url];
// [book setTitle:title];
// [book setStars:stars];
// [book setVist:vist];
// [book setLevel:level];
[_array addObject:book];
}
//删除书签
- (void) removeBookMark:(NSString *)title{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
[_array removeObject:_array[i]];
return;
}
else NSLog(@"没有这个书签");
}
}
//改动书签
- (void) modifyTitle:(NSString *)title withNewTitle:(NSString *)newTitle{
for (int i = 0; i < [_array count]; i ++) {
if ([title isEqualToString:[_array[i] getTitle]]) {
[_array[i] setTitle:newTitle];
}
}
}
//查找书签
- (void) searchWithTitle:(NSString *)title{
int index = -1; //保存书签位置
//index = -1 表示没有找到相应的书签
//遍历书签。找到后就保存目标书签位置后退出循环
for (int i = 0; i < [_array count]; i ++) {
if([title isEqualToString:[_array[i] getTitle]])
{
index = i;
break;
}
}
if (index == -1) {
NSLog(@"没有找到须要查找的书签");
}
else NSLog(@"找了该书签 pos = %d",index);
}
- (void) sortWithStars{
//使用冒泡排序对书签对象进行排序
for (int i = 0; i < [_array count] - 1; i ++) { //控制排序的轮数
for (int j = 0; j < [_array count] - 1 - i; j ++) { //控制比較的次数
if ([_array[j] getStars] > [_array[j + 1] getStars]) {
NSArray * temp;
temp = _array[j];
_array[j] = _array[j + 1];
_array[j + 1] = temp;
}
}
}
}
- (void) showAllBookMark{
for (int i = 0; i < [_array count]; i ++) {
NSLog(@"网址:%@ 标题:%@ 星级:%ld 訪问量:%ld 权限:%c",
[_array[i] getUrl],
[_array[i] getTitle],
[_array[i] getStars],
[_array[i] getVist],
[_array[i] getLevel]);
}
}
@end

5.书签管理器的操作

这一步我们想象成是人在操作一个带界面的书签管理器,因为没有界面,我们就仅仅能在main函数里面操作了。比如:

#import <Foundation/Foundation.h>
#import "BookMark.h"
#import "BookManager.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//新建一个百度的书签
BookManager * myBookManager = [[BookManager alloc] init];
[myBookManager addBookMarkWithUrl:@"www.baidu.com" withTitle:@"百度" withStars:3 withVist:123 withLevel:'A'];
//新建一个新浪的书签
[myBookManager addBookMarkWithUrl:@"www.sina.com" withTitle:@"新浪" withStars:7 withVist:456 withLevel:'B'];
//新建一个搜狐的书签
[myBookManager addBookMarkWithUrl:@"www.souhu.com" withTitle:@"搜狐" withStars:5 withVist:756 withLevel:'C'];
//反复加入
[myBookManager addBookMarkWithUrl:@"www.souhu.com" withTitle:@"搜狐" withStars:5 withVist:756 withLevel:'C'];
//显示所有书签
NSLog(@"所有加入的书签");
[myBookManager showAllBookMark];
//查找
[myBookManager searchWithTitle:@"新浪"];
//删除
[myBookManager removeBookMark:@"百度"];
NSLog(@"删除后的书签");
[myBookManager showAllBookMark];
//排序
[myBookManager sortWithStars];
NSLog(@"排序后的书签");
[myBookManager showAllBookMark];
//改动
[myBookManager modifyTitle:@"新浪" withNewTitle:@"123"];
NSLog(@"改动后的书签");
[myBookManager showAllBookMark];
}
return 0;
}

首先我们天剑三个书签:百度、新浪和搜狐。

书签的内容就是程序中的内容。

然后我们验证添加书签、查找书签、删除书签、书签排序和改动书签的行为方法是否正确。

最后程序的输出是:

2015-07-22 20:15:58.560 3.书签管理器[3083:303] 反复加入
2015-07-22 20:15:58.562 3.书签管理器[3083:303] 所有加入的书签
2015-07-22 20:15:58.563 3.书签管理器[3083:303] 网址:www.baidu.com 标题:百度 星级:3 訪问量:123 权限:A
2015-07-22 20:15:58.565 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.565 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.566 3.书签管理器[3083:303] 找了该书签 pos = 1
2015-07-22 20:15:58.568 3.书签管理器[3083:303] 删除后的书签
2015-07-22 20:15:58.568 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.569 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.570 3.书签管理器[3083:303] 排序后的书签
2015-07-22 20:15:58.571 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.573 3.书签管理器[3083:303] 网址:www.sina.com 标题:新浪 星级:7 訪问量:456 权限:B
2015-07-22 20:15:58.574 3.书签管理器[3083:303] 改动后的书签
2015-07-22 20:15:58.576 3.书签管理器[3083:303] 网址:www.souhu.com 标题:搜狐 星级:5 訪问量:756 权限:C
2015-07-22 20:15:58.577 3.书签管理器[3083:303] 网址:www.sina.com 标题:123 星级:7 訪问量:456 权限:B
Program ended with exit code: 0

和我们预期的是一样的,说明我们的书签管理器的项目功能是实现了。

6.总结

在这个书签管理器中我们有下面几点须要学习的:

1.分析项目需求;

2.找对象,抽象出类。分析类的属性和行为;

3.实现类;

4.验证相关行为或方法是否正确。

书签管理器里面存储的是书签,书签里面存储的是数据。这里我在书签管理器里面设置一个可变数组的行为来存储书签的地址。每次添加一个书签的时候我们就创建一个书签的对象。并把书签的数据写进去。

删除书签的时候就删除该书签在数组中的位置就能够了。

【iOS开发之Objective-C】书签管理器项目的更多相关文章

  1. Android开发之AudioManager(音频管理器)具体解释

    AudioManager简单介绍: AudioManager类提供了訪问音量和振铃器mode控制. 使用Context.getSystemService(Context.AUDIO_SERVICE)来 ...

  2. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  3. 李洪强iOS开发之iOS好文章收集

    李洪强iOS开发之iOS好文章收集 该文收集朋友们转发或自己的写的技术文章,如果你也有相关的好文章,欢迎留言,当好文章多的时候,我会对这些好文章进行分门别类 文章 简述 日期 直播服务配置 使用 ng ...

  4. 李洪强IOS开发之iOS好项目收集

    李洪强IOS开发之iOS好项目收集 在这里收集一些最近出现的比较实用好玩的框架或者项目,会不断更新 项目 简述 日期 SCTableViewCell 类似与QQ侧滑删除Cell的Demo 201501 ...

  5. iOS 开发之 GCD 基础

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  6. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  7. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  8. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  9. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

随机推荐

  1. 根据url下载图片和页面

    需要将&tp=webp&wxfrom=5去掉,既可以在任何地方显示,也可以下载了 http://mmbiz.qpic.cn/mmbiz_jpg/bf8pC39RBhGFOH1ib9Ac ...

  2. iOS Sqlite加密(FMDB/SQLCipher)

    /** * 对数据库加密 * * @param path path description * * @return return value description */ + (BOOL)encryp ...

  3. arcgis python图形信息

    属性 说明 area 面要素的面积值:对于所有其他要素类型为空 centroid 如果质心位于要素之内或要素之上则为真:否则返回标注点(返回一个点对象) 范围 返回一个范围对象 firstPoint ...

  4. .NET:用T4消除代码重复,对了,也错了

    背景 我需要为int.long.float等这些数值类型写一些扩展方法,但是我发现他们不是一个继承体系,我的第一个思维就是需要为每个类型重复写一遍扩展方法,这让我觉得非常不爽,但是我还是不情愿的写了, ...

  5. PHP 输出数据库中文是问号

  6. 分享一个基于 Node.js 的 Web 开发框架 - Nokitjs

    简介 Nokit 是一个简单易用的基于 Nodejs 的 Web 开发框架,默认提供了 MVC / NSP / RESTful 等支持,并提供对应项目模板.管理工具. 资源 GitHub https: ...

  7. poi 技术动态更新 Excel模板内容,动态更新内容

    1.控制器方法 private URL base = this.getClass().getResource(""); /** * 流拍之后,可以下载询价单 * * @param ...

  8. qsort(),sort()排序函数

    一.qsort()函数 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp ...

  9. 关于QtCharts中的映射器与模型的使用

    简述 本文章基于博主在使用QtCharts中一些经验总结,相关了Qt类有QVXYModelMapper,CustomTableModel(一个继承了QAbstractTableModel的类,用于实现 ...

  10. 开发者和系统管理者最喜爱的开源工具Vim 起步学习的五个技巧

    多年来,我一直想学 Vim.如今 Vim 是我最喜欢的 Linux 文本编辑器,也是开发者和系统管理者最喜爱的开源工具.我说的学习,指的是真正意义上的学习.想要精通确实很难,所以我只想要达到熟练的水平 ...