swift String字符串操作篇

2022-06-25  本文已影响0人  HH思無邪
截屏2022-06-21 11.40.38.png

应用场景

这种常见的朋友圈样式,相信在社交资讯类App 应该很常见吧,在一段文本中需要实现特殊文本高亮显示和能够点击进入到对应的详情页

首先 来回顾一下实现需求相关的知识点

  1. 截取前三个字符
 //方法一        
 let str = "0123456789"
 let subStr = str.prefix(3)
 print(subStr)//输出012

 //方法二
 let str = "0123456789"
 let endIndex =  str.index(str.startIndex, offsetBy: 3)
 let newStr = String(str[..<endIndex])
 print(newStr)//输出012
  1. 截取第三个到第六个范围内的字符
 let str = "0123456789"
 let startIndex = str.index(str.startIndex, offsetBy: 3)
 let endIndex =  str.index(str.startIndex, offsetBy: 6)
 let newStr = String(str[startIndex..<endIndex])
 print(newStr)//输出345
  1. 截取后三个字符
//方法一
 let str = "0123456789"
 let subStr = str.suffix(3)
 print(subStr)//输出789
 
 //方法二
 let str = "0123456789"
 let startIndex =  str.index(str.endIndex, offsetBy: -3)
 let newStr = String(str[startIndex..<str.endIndex])
 print(newStr)

4.删除范围的字符串

var str = "0123456789"
let  startIndex = str.startIndex
 let  endIndex = str.index(startIndex, offsetBy: 5)
 let  range = startIndex...endIndex
str.removeSubrange(range)
print(str)//6789
  1. 插入字符串
var str = "123567"
let insetIndex = str.index(str.startIndex, offsetBy: 3)
str.insert("4", at: insetIndex)
print(str) //1234567
  1. 字符串根据字符 拆成数组
let str = "P|71144|《记承天寺夜游》"
let array = str.components(separatedBy: "|")
print(array)
//["P", "71144", "《记承天寺夜游》"]

接下来 看看如何具体实现这个需求

分析后端提供的数据

 rich_content = "今天真高兴!没想到张怀民也到承天寺来了,终于不是我
孤零零一个人在这了。晚饭都多吃了点,这会撑得有些睡不着,看来还得出
去消消食才行……出门发现今晚月色如醉,正好怀民也没睡着,这不巧了
吗?我还特地写了篇日记{{P|71144|《记承天寺夜游》}}!\n元丰六年十月十
二日夜,解衣欲睡,月色入户,欣然起行。念无与为乐者,遂至承天寺寻张
怀民。怀民亦未寝,相与步于中庭。庭下如积水空明,水中藻荇交横,盖竹
柏影也。何夜无月?何处无竹柏?但少闲人如吾两人者耳。\n这里是第二个
链接,是一个古籍:{{G|12|《本草纲目》}}"

需要特殊处理的部分

{{P|71144|《记承天寺夜游》}}
{{G|12|《本草纲目》}}

具体实现

  1. 从原文本中提取出特殊部分
  2. 从原文本中移除特殊部分
  3. 规则部分去掉前后的{}
  4. 得到高亮显示的文本
  5. 将高亮文本插入到原文本中

完整代码如下

var rich_content = ""

var richArray = [String]()
for _ in 0...rich_content.count{
    
    if let startindex = rich_content.firstIndex(of: "{"){
        
        if let index = rich_content.firstIndex(of: "}"){
           let endindex = rich_content.index(index, offsetBy: 1)
            let richstr = String(rich_content[startindex...endindex])
            
            let pureRich = getPureRich(str: richstr)
            
            richArray.append(pureRich)
            
            //移除规则文本
            rich_content.removeSubrange(startindex...endindex)
            
            let insetStr = getSpecText(richStr: pureRich)
            
            //插入高亮显示文本
            rich_content.insert(contentsOf: insetStr, at: startindex)
            
        }
        
    }else{
        break
    }
}

//去掉 前后的 {} 得到纯规则文本
func getPureRich(str: String) -> String {
    let preIndex = str.index(str.startIndex, offsetBy: 2)
    let sufIndex = str.index(str.endIndex, offsetBy: -3)
    
    let pureRich = String(str[preIndex...sufIndex])
    
    return pureRich
}
//获取高亮显示的特殊文本
func getSpecText(richStr: String) -> String{
    let array = richStr.components(separatedBy: "|")
    let specStr = array[2]
    print(specStr)
    return specStr
}

print(rich_content)
print(richArray)//["P|71144|《记承天寺夜游》", "G|12|《本草纲目》"]

安利一个好用的Swift富文本三方:
AttributedString

到这里,本篇文章通过一个朋友圈列表常见的应用场景,列举了一些字符串相关的基础知识,一步一步用这些基础知识,实现了这个需求。

如果觉得文章对你有用,那就点个赞支持一下吧!
如果有任何疑问或写得不好的地方请在评论区留言 🙏


参考文章:
Swift 字符串截取

上一篇下一篇

猜你喜欢

热点阅读