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

0. 概览

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

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

在本篇博文中您将学到以下内容:

  • [0. 概览](#0. 概览)
  • [1. 分割字符串,轻而易举?](#1. 分割字符串,轻而易举?)
  • [2. iOS 16 之前的一种解决](#2. iOS 16 之前的一种解决)
  • [3. 我们的小目标:兼容所有 iOS!](#3. 我们的小目标:兼容所有 iOS!)
  • [4. iOS 16 之前对于 URL 特殊字符串组件分隔的解决](#4. iOS 16 之前对于 URL 特殊字符串组件分隔的解决)
  • [5. 字符串分割一个实际应用](#5. 字符串分割一个实际应用)
  • 总结

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

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


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

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

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

swift 复制代码
let string = "Hello||World||Dear||hopy!!!"
let parts = string.split(separator: "||")

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


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

2. iOS 16 之前的一种解决

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

swift 复制代码
let string = "Hello||World||Dear||hopy!!!"
let parts = (string as NSString).components(separatedBy: "||")

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

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

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

swift 复制代码
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)
        }
    }
}

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

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

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

swift 复制代码
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
    }
}

我们可以这样调用它:

swift 复制代码
let urlString = "https://www.bilibili.com//s1.hdslb.com/bfs/static/jinkela/video/asserts/oldfanIcon.svg"

let fixedUrlString = ImageParser.fixMultipleDoubleSlash(urlString)

它的运行结果如下:

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

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

总结

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

感谢观赏,再会!😎

相关推荐
威化饼的一隅10 小时前
【多模态】swift-3框架使用
人工智能·深度学习·大模型·swift·多模态
opentogether2 天前
Swift 的动态性
开发语言·ssh·swift
苍墨穹天3 天前
SWIFT基本使用
linux·swift
SchneeDuan3 天前
从源码分析swift GCD_DispatchGroup
ios·swift·源码分析·gcd
请叫我飞哥@5 天前
iOS在项目中设置 Dev、Staging 和 Prod 三个不同的环境
ios·xcode·swift
Cedric_Anik7 天前
iOS渲染概述
ui·ios·swift
hxx2217 天前
iOS swift开发系列--如何给swiftui内容视图添加背景图片显示
ios·swiftui·swift
胖虎18 天前
SwiftUI - (十九)组合视图
ios·swiftui·swift·组合视图
davidson14718 天前
Xcode
ios·swiftui·xcode·swift·apple
威化饼的一隅9 天前
【多模态】swift框架使用qwen2-vl
人工智能·深度学习·大模型·swift·多模态模型·qwen2-vl