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. WebLogic中WLS 组件漏洞(CVE-2017-10271)专项检测工具

    来源: 时间:2017-12-23 00:00:00 作者: 浏览:1929 次 近期安恒信息在应急响应过程中发现有恶意攻击者利用WebLogic漏洞对企业服务器发起大范围远程攻击,攻击成功后植入挖矿 ...

  2. 浏览器User-Agent的详细信息

    PC端: safari 5.1 – MACUser-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit ...

  3. Thymeleaf th:action

    th:attr 任何属性值 <form action="subscribe.html" th:attr="action=@{/subscribe}"> ...

  4. 关于TagHelper的那些事情——自定义TagHelper(内嵌TagHelper)

    内嵌TagHelper 上一篇文章中提到有时候需要设计一种内嵌的TagHelper,如下: <my name="yy" age="35"> < ...

  5. Orchard运用 - 定制博客分页显示

    一般,对于条目过多的系统或博客,分页显示是最简单的方式.目前分页方式基本有三种格式: 1.显示所有信息,包括标明当前页面,提供上一页和下一页链接和使用首页和末页链接. 2.只标注上一页和下一页链接. ...

  6. C# 实现将 PDF 转文本的功能

    更新 2014年2月27日: 这篇文章最初只描述使用 PDFBox 来解析PDF文件.现在它已经被扩展到包括使用 IFilter 和 iTextSharp 的例程了. 这篇文章和对应的Visual S ...

  7. java学习笔记8--接口总结

    接着前面的学习: java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3- ...

  8. 【python】Django设置SESSION超时时间没有生效?

    按手册和网上的方法在settings.py中设置“SESSION_COOKIE_AGE” 和 “SESSION_EXPIRE_AT_BROWSER_CLOSE” 均不生效. 通过查看django的源代 ...

  9. [Functional Programming] Working with two functors(Applicative Functors)-- Part2 --liftAN

    Let's examine a pointfree way to write these applicative calls. Since we know map is equal to of/ap, ...

  10. [React] Ensure all React useEffect Effects Run Synchronously in Tests with react-testing-library

    Thanks to react-testing-library our tests are free of implementation details, so when we refactor co ...