设计类-歌词解析类

1、设计要求

传入一个txt格式的歌词文件,可以输出歌曲作者、名称和时间顺序的歌词内容。


屏幕快照 2016-10-18 下午3.50.53.png
LRCitem.h
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Heiti SC Light'; color: #008400}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2ca2}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #bb2ca2}span.s4 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s5 {font-variant-ligatures: no-common-ligatures; color: #008400}span.s6 {font: 11.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #008400}span.s7 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s8 {font-variant-ligatures: no-common-ligatures; color: #4f8187}

#import <Foundation/Foundation.h>

@interface LRCitem : NSObject
{
    float _lrcTime;  //歌词时间点
    NSString *_lrcString;  //歌词
}

-(id)initWithLrcTime:(float)time andLrcString:(NSString *)lrcString;

//setter
-(void)setLrcTime:(float)time;
-(void)setLrcString:(NSString *)lrcString;

//getter
-(float)lrcTime;
-(NSString *)lrcString;

//排序规则:按照歌词时间排序
-(BOOL)isSortByTime:(LRCitem *)aItem;

-(void)printLrcItem;

@end
LrcManager.h
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Heiti SC Light'; color: #008400}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2ca2}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font-variant-ligatures: no-common-ligatures; color: #bb2ca2}span.s3 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s4 {font-variant-ligatures: no-common-ligatures; color: #008400}span.s5 {font: 11.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #008400}span.s6 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}

@interface LrcManager : NSObject
{
    NSString *_title; //歌曲名
    NSString *_auther; //歌手
    NSMutableArray *_lrcList; //保存词条对象的数组
    
}

//构造方法,传入文件路径,初始化歌词管理器对象
-(id)initWithLrcFile:(NSString *)path;

-(void)showLrcItems; //遍历整个歌词文件

//给用户公开一个接口。输入时间,得到对应内容
+(void)userInterface;

@end

2、方法实现

LRCitem.m
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2ca2}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #4f8187}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Heiti SC Light'; color: #008400}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #000000}span.s4 {font-variant-ligatures: no-common-ligatures; color: #bb2ca2}span.s5 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s6 {font-variant-ligatures: no-common-ligatures; color: #3d1d81}span.s7 {font-variant-ligatures: no-common-ligatures; color: #4f8187}span.s8 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s9 {font-variant-ligatures: no-common-ligatures; color: #31595d}

#import "LRCitem.h"

@implementation LRCitem

-(id)initWithLrcTime:(float)time andLrcString:(NSString *)lrcString
{
    self = [super init];
    if (self) {
        _lrcString=lrcString;
        _lrcTime=time;
    }
    return self;
}

//setter
-(void)setLrcTime:(float)time
{
    _lrcTime = time;
}
-(void)setLrcString:(NSString *)lrcString
{
    _lrcString = lrcString;
}

//getter
-(float)lrcTime
{
    return  _lrcTime;
}
-(NSString *)lrcString
{
    return _lrcString;
}

//排序规则
-(BOOL)isSortByTime:(LRCitem *)aItem
{
    if ([self lrcTime] > [aItem lrcTime]) {
        return  YES;
    }
    else
        return NO;
}

-(void)printLrcItem
{
    NSLog(@"time is %.2f, lrc is %@", [self lrcTime], [self lrcString]);
}
@end
LrcManager.m
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; min-height: 13.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px 'Heiti SC Light'; color: #008400}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #008400}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #bb2ca2}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #3d1d81}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font: 11.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures}span.s4 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s5 {font-variant-ligatures: no-common-ligatures; color: #bb2ca2}span.s6 {font-variant-ligatures: no-common-ligatures; color: #000000}span.s7 {font-variant-ligatures: no-common-ligatures; color: #4f8187}span.s8 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s9 {font-variant-ligatures: no-common-ligatures; color: #3d1d81}span.s10 {font-variant-ligatures: no-common-ligatures; color: #31595d}span.s11 {font-variant-ligatures: no-common-ligatures; color: #008400}span.s12 {font: 11.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #008400}span.s13 {font: 11.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #000000}span.s14 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}span.s15 {font-variant-ligatures: no-common-ligatures; color: #272ad8}

#import "LrcManager.h"

#define LrcPath @"/Users/bear/Desktop/传奇歌词.txt"

//类扩展。可以给类扩展实例变量或者方法,可以实现实力变量和方法的私有化(不公开)
@interface LrcManager()   //括号中不允许添加任何东西

-(BOOL)parseLrcFile:(NSString *)path;
-(void)parseLrcTitle:(NSString *)lineString;
-(void)parseLrcAuther:(NSString *)lineString;
-(void)parseLrcItem:(NSString *)lineString;
-(float)parseLrcTime:(NSString *)timeString;

@end

@implementation LrcManager

//构造方法,传入文件路径,初始化歌词管理器对象
-(id)initWithLrcFile:(NSString *)path
{
    self = [super init];
    if (self) {
        _lrcList = [NSMutableArray array];
        [self parseLrcFile:path];  //解析歌词文件
    }
    return self;
}

-(BOOL)parseLrcFile:(NSString *)path
{
    NSString *fileContent = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    if (!fileContent) {  //判断歌词文件是否读取成功
        return NO;
    }
    //每行歌词都用换行进行了分割
    NSArray *lineArray = [fileContent componentsSeparatedByString:@"\n"];
    NSInteger lineCount = [lineArray count];
    for (NSInteger i=0; i<lineCount; i++) {   //可能行为空
        NSString *lineString = [lineArray objectAtIndex:i]; //把每行分割出来
        if([lineString isEqualToString:@""])
        {
            continue;  //空行跳过
        }
        else if ([lineString hasPrefix:@"[ti:"]) //包含这个字符
        {
            //解析歌曲名
            [self parseLrcTitle:lineString];
        }
        else if ([lineString hasPrefix:@"[ar:"]) {
            //解析歌曲演唱者
            [self parseLrcAuther:lineString];
        }
        else
        {
            //解析词条
            [self parseLrcItem:lineString];
        }
    }
    //对歌词的词条对象进行排序
    [_lrcList sortUsingSelector:@selector(isSortByTime:)];
    
    return YES;
}

//解析歌词标题的实现
-(void)parseLrcTitle:(NSString *)lineString
{
    NSInteger len=[lineString length];
    _title = [lineString substringWithRange:NSMakeRange(4, len-4-1)];
}

//解析歌曲作者
-(void)parseLrcAuther:(NSString *)lineString
{
    NSInteger len=[lineString length];
    _auther = [lineString substringWithRange:NSMakeRange(4, len-4-1)];
}

//解析歌词词条
-(void)parseLrcItem:(NSString *)lineString
{
    NSArray *lrcArray = [lineString componentsSeparatedByString:@"]"];
    NSInteger count = [lrcArray count];
    for (NSInteger i=0; i<count-1; i++) {
        LRCitem *item = [[LRCitem alloc] init];
        //解析歌词时间
        [item setLrcTime:[self parseLrcTime:[lrcArray objectAtIndex:i]]];
        
        //设置歌词内容
        [item setLrcString:[lrcArray lastObject]];
        
        //把解析出来的歌词条添加到可变数组中
        [_lrcList addObject:item];
    }
}

//解析歌词时间的方法实现  [01:14.81
-(float)parseLrcTime:(NSString *)timeString
{
    NSString *minString = [timeString substringWithRange:NSMakeRange(1, 2)];
    NSString *secString = [timeString substringWithRange:NSMakeRange(4, 5)];
    return ([minString intValue]*60+[secString floatValue]);
}

-(void)showLrcItems
{
    for (LRCitem *item in _lrcList) {
        [item printLrcItem];
    }
}

//给用户公开一个接口。输入时间,得到对应内容
+(void)userInterface
{
    LrcManager *manager = [[LrcManager alloc] initWithLrcFile:LrcPath];
    [manager showLrcItems];
    
}

@end

3、需要注意的

在LrcManager.m文件中,我首次使用了类扩展的功能。
目前的理解就是,扩展的方法为这个类私有的。比如在本程序中,扩展的5个方法都是LrcManager私有的,这几个方法的声明和实现都写在了.m文件中,而没有写到.h文件中。所以,当别的类或者main函数import LrcManager.h文件时,也无法使用这几个类,所以叫做“私有”。
好处就是封装性。

还有一个问题是,这次的类设计比前几个都略复杂,明显感觉到不管是写.h文件的方法声明还是.m文件中的扩展方法,一开始想的都不全面,很可能在实现一个已经声明的方法时发现还需要添加一个新的方法,这就需要边写边添加。思路清晰很重要,弄清几个类之间的关系。

TODO

1、 类方法和对象方法的区别。
2、类扩展功能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 诗句封装在瓶子里 不再喝的烈酒 还有遗忘的星空 疲惫的眼睛 越是努力越看不清 黑夜里消失的月光 用什么来弥补 如何...
    yummy6阅读 202评论 0 0
  • 瓜藤 文/路人锋 一根攀援铁栅的瓜藤随风摇曳半空中秋慢慢蜗牛般爬上它宽阔的叶 西风飘摇了一夜一夜枝干被一只只秋悄悄...
    路人锋阅读 872评论 13 21
  • 早上起床老大说昨天蹲的屁股还疼,吃饭也没有坐下吃,我让他趴床上给他按了按,问题不大,可能就蹲了一下。上...
    502班赵梓旭阅读 147评论 0 0