• Swift 如何打造兼容新老系统的字符串分割(split)方法


    在这里插入图片描述

    0. 概览

    在 Swift 的开发中,我们经常要与字符串打交道。其中一个常见的操作就是用特定的“分隔符”来分割字符串,这里分隔符可能不仅仅是字符,而是多字符组成的字符串。

    从 iOS 16 开始, 新增了对应的方法来专注此事。不过,对于 iOS 16 之前的系统我们又该何去何从呢?

    相信学完本篇后,小伙伴们对字符串分割的实现又会有更多的理解。

    那还等什么呢?Let‘s split it!!!😉


    1. 分割字符串,轻而易举?

    从 iOS 16 开始  为集合(Collection)新增了一个 split 方法,它可以用和集合元素同样类型的“分隔符”来分割集合本身:

    在这里插入图片描述

    字符串也算一个集合,所以对于用字符串来分割字符串来说这真是恰到好处:

    let string = "Hello||World||Dear||hopy!!!"
    let parts = string.split(separator: "||")
    
    • 1
    • 2

    在这里插入图片描述


    注意,这里讨论的是用字符串来分割字符串,请不要将其和用字符来分割字符串相混淆,因为后者是 String 本身的方法,而且已经存在很久了:

    在这里插入图片描述


    看来从 iOS 16+ 开始用字符串分割字符串简直是轻而易举,不过 iOS 16 之前怎么办呢?

    2. iOS 16 之前的一种解决

    在 iOS 16 之前的系统中,我们可以借助 Objc 语言中 NSString 的神奇力量来达到同样的目的:

    let string = "Hello||World||Dear||hopy!!!"
    let parts = (string as NSString).components(separatedBy: "||")
    
    • 1
    • 2

    在这里插入图片描述

    如上代码所示,我们利用 String 底层桥接 NSString 的 components() 方法做到了同样的事。

    3. 我们的小目标:兼容所有 iOS!

    为了能够在所有 iOS 上都实现字符串分割字符串的功能,我们有必要将上面两种方法合并成为一个新的方法:

    extension String {
        public func splitBy(separator: String) -> [String] {
            if #available(iOS 16.0, *) {
                return split(separator: separator).map(String.init)
            } else {
                return (self as NSString).components(separatedBy: separator)
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    现在无论在何种版本的系统中,我们都可以直接游刃有余的调用这个新方法了:

    在这里插入图片描述

    4. iOS 16 之前对于 URL 特殊字符串组件分隔的解决

    如果我们要分割的是特殊类型的字符串,比如将表示 URL 链接的字符串分割成 各个 URL 组成部分,我们还可以使用老朋友 NSString 的 pathComponents() 方法来完成此事:

    在这里插入图片描述

    5. 字符串分割一个实际应用

    在从网页中解析图片时,往往会取得下面这种形式的图片地址:

    https://www.bilibili.com//s1.hdslb.com/bfs/static/jinkela/video/asserts/oldfanIcon.svg

    注意,它其中包含两个 “//” 。此时,图片实际的地址应该为:

    https://s1.hdslb.com/bfs/static/jinkela/video/asserts/oldfanIcon.svg

    我们可以利用上面的字符串分割技术来轻松修正这种类型的图片地址:

    enum ImageParser {
        // 将 https://1.com//2.com/x/a.png 形式的 URL 修正为 https://2.com/x/a.png
        static func fixMultipleDoubleSlash(_ urlString: String) -> String {
            var parts = urlString.splitBy(separator: "//")
            if parts.count > 2 {
                _ = parts.remove(at: 1)
                return parts.joined(separator: "//")
            }
            return urlString
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们可以这样调用它:

    let urlString = "https://www.bilibili.com//s1.hdslb.com/bfs/static/jinkela/video/asserts/oldfanIcon.svg"
    
    let fixedUrlString = ImageParser.fixMultipleDoubleSlash(urlString)
    
    • 1
    • 2
    • 3

    它的运行结果如下:

    在这里插入图片描述

    最后,让我们看一下此项技术在 App 中的实际应用:

    在这里插入图片描述

    小伙伴们从上面 App 的演示中可以看到,我们利用字符串分割技术成功解析出了原先无法解析的图片,并将它们显示出来。棒棒哒!💯

    总结

    在本篇博文中,我们讨论了在 iOS 16 之前和之后如何实现字符串分割字符串的功能,并用把它应用到了实际的例子中。

    感谢观赏,再会!😎

  • 相关阅读:
    如何实现办公终端安全
    第4章_瑞萨MCU零基础入门系列教程之瑞萨 MCU 源码设计规范
    机器人中的数值优化(八)——拟牛顿方法(上)
    c++类对象的内存分布 以及 虚继承实现原理
    CS5817规格书|CS5817芯片参数|多功能便携式显示器方案芯片规格
    Android 开发学习笔记:七大知识点板块汇总
    1460_TC275_Lite_Kit-UserManual阅读笔记2
    mysql数据库的管理
    智引未来:2024年科技革新引领工业界变革与机遇
    MindSpore社区与北大BIOPIC联合发布蛋白质多序列比对开源数据集
  • 原文地址:https://blog.csdn.net/mydo/article/details/134477285