實(shí)用小技巧(二十八)—— 一種字符串的遍歷方式

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.11.22

前言

在app中杂靶,很多時(shí)候都需要熟悉一些小技巧讓您事半功倍,提高工作效率呀狼,這些小技巧都很小很細(xì)等曼。感興趣的可以看看我寫的其他小技巧里烦。
1. 實(shí)用小技巧(一):UIScrollView中上下左右滾動(dòng)方向的判斷
2. 實(shí)用小技巧(二):屏幕橫豎屏的判斷和相關(guān)邏輯
3.實(shí)用小技巧(三):點(diǎn)擊手勢(shì)屏蔽子視圖的響應(yīng)
4.實(shí)用小技巧(四):動(dòng)態(tài)的增刪標(biāo)簽視圖
5.實(shí)用小技巧(五):通過相冊(cè)或者相機(jī)更改圖標(biāo)
6.實(shí)用小技巧(六):打印ios里所有字體
7. 實(shí)用小技巧(七):UITableViewCell自適應(yīng)行高的計(jì)算
8. 實(shí)用小技巧(八):數(shù)字余額顯示的分隔
9.實(shí)用小技巧(九):類頭條模糊背景的實(shí)現(xiàn)
10.實(shí)用小技巧(十):晃動(dòng)手機(jī)換后臺(tái)服務(wù)器網(wǎng)絡(luò)
11.實(shí)用小技巧(十一):scrollView及其子類顯示的一些異常處理
12.實(shí)用小技巧(十二):頭像圖片縮放以及保存到相冊(cè)簡(jiǎn)單功能的實(shí)現(xiàn)
13.實(shí)用小技巧(十三):一種類酷我音樂盒動(dòng)畫實(shí)現(xiàn)
14.實(shí)用小技巧(十四):生成跳往applestore指定app的方法
15.實(shí)用小技巧(十五):左側(cè)向右滑動(dòng)返回上一級(jí)控制器
16.實(shí)用小技巧(十六):獲取設(shè)備信息
17.實(shí)用小技巧(十七):清除緩存目錄
18.實(shí)用小技巧(十八):取出gif圖的每一幀
19.實(shí)用小技巧(十九):獲取相機(jī)和麥克風(fēng)權(quán)限
20.實(shí)用小技巧(二十):游客模式的實(shí)現(xiàn)
21.實(shí)用小技巧(二十一):版本檢測(cè)的實(shí)現(xiàn)
22.實(shí)用小技巧(二十二):鍵盤遮擋問題
23. 實(shí)用小技巧(二十三):獲取閃光燈的控制
24. 實(shí)用小技巧(二十四):APP頁(yè)面開啟跳轉(zhuǎn)邏輯處理
25. 實(shí)用小技巧(二十五)—— 關(guān)于UILabel控件寬高的計(jì)算
26. 實(shí)用小技巧(二十六)—— APP中各種權(quán)限監(jiān)測(cè)和申請(qǐng)工具封裝
27. 實(shí)用小技巧(二十七)—— 控制器跳轉(zhuǎn)邏輯的封裝

功能需求

要求可以對(duì)字符串進(jìn)行遍歷凿蒜,并將其分解為數(shù)組中的每一個(gè)元素禁谦。


功能實(shí)現(xiàn)

大家知道,字符串可以用enumerate方法進(jìn)行遍歷废封,下面我們看另外一種遍歷的方式州泊。還是直接看代碼。

在寫代碼之前要引入CoreText框架漂洋。

#import <CoreText/CoreText.h>

看詳細(xì)代碼遥皂。

#import "ViewController.h"
#import <CoreText/CoreText.h>

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    UILabel *label = [[UILabel alloc] init];
    label.text = @"我是一只小小鳥??niao!";
    
    NSArray *stringArr = [self getStringArrFromLabel:label];
    NSLog(@"數(shù)組是 = %@", stringArr);
}

#pragma mark - Object Private Function

- (NSArray *)getStringArrFromLabel:(UILabel *)label
{
    if (!label.text) {
        label.text = @"";
    }
    NSString *text = [label text];
    UIFont   *font = [label font];
    CGRect    rect = [label frame];
    
    CTFontRef myFont = CTFontCreateWithName((__bridge CFStringRef)([font fontName]), [font pointSize], NULL);
    NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc] initWithString:text];
    [attStr addAttribute:(NSString *)kCTFontAttributeName value:(__bridge_transfer id)myFont range:NSMakeRange(0, attStr.length)];
    
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attStr);
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, CGRectMake(0,0,rect.size.width,100000));
    
    CTFrameRef frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, NULL);
    if (frameSetter) {
        CFRelease(frameSetter);
    }
    if (path) {
        CFRelease(path);
    }
    NSArray *lines = (__bridge NSArray *)CTFrameGetLines(frame);
    NSMutableArray *linesArray = [[NSMutableArray alloc]init];
    if (frame) {
        CFRelease(frame);
    }
    for (id line in lines)
    {
        CTLineRef lineRef = (__bridge CTLineRef )line;
        CFRange lineRange = CTLineGetStringRange(lineRef);
        NSRange range = NSMakeRange(lineRange.location, lineRange.length);
        
        NSString *lineString = [text substringWithRange:range];
        [linesArray addObject:lineString];
    }
    
    return (NSArray *)linesArray;
}

@end

下面我們看輸出結(jié)果

2017-11-22 21:38:23.536399+0800 JJStringEnumerate[1033:14545] 數(shù)組是 = (
    "\U6211",
    "\U662f",
    "\U4e00",
    "\U53ea",
    "\U5c0f",
    "\U5c0f",
    "\U9e1f",
    "\Ud83d\Udc26",
    n,
    i,
    a,
    o,
    "\Uff01"
)

根據(jù)輸出結(jié)果刽漂,我們可以看到演训,字符串的每一個(gè)單元字符或者文字都被遍歷出來了,并存在一個(gè)不可變數(shù)組中贝咙,打印出來也完全正確样悟。代碼已經(jīng)上傳至刀客傳奇 - GitHub

后記

未完庭猩,待續(xù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窟她,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蔼水,更是在濱河造成了極大的恐慌震糖,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趴腋,死亡現(xiàn)場(chǎng)離奇詭異吊说,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)优炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門颁井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人穿剖,你說我怎么就攤上這事蚤蔓。” “怎么了糊余?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵秀又,是天一觀的道長(zhǎng)单寂。 經(jīng)常有香客問我,道長(zhǎng)吐辙,這世上最難降的妖魔是什么宣决? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮昏苏,結(jié)果婚禮上尊沸,老公的妹妹穿的比我還像新娘。我一直安慰自己贤惯,他們只是感情好洼专,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著孵构,像睡著了一般屁商。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颈墅,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天蜡镶,我揣著相機(jī)與錄音,去河邊找鬼恤筛。 笑死官还,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毒坛。 我是一名探鬼主播望伦,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼粘驰!你這毒婦竟也來了屡谐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤蝌数,失蹤者是張志新(化名)和其女友劉穎愕掏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顶伞,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饵撑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唆貌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑潘。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锨咙,靈堂內(nèi)的尸體忽然破棺而出语卤,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布粹舵,位于F島的核電站钮孵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眼滤。R本人自食惡果不足惜巴席,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诅需。 院中可真熱鬧漾唉,春花似錦、人聲如沸堰塌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔫仙。三九已至料睛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間摇邦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工屎勘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留施籍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓概漱,卻偏偏與公主長(zhǎng)得像丑慎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓤摧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容