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 之前和之后如何实现字符串分割字符串的功能,并用把它应用到了实际的例子中。

感谢观赏,再会!😎

相关推荐
TT_Close4 天前
【Flutter×鸿蒙】FVM 不认鸿蒙 SDK?4步手动塞进去
flutter·swift·harmonyos
张江4 天前
Swift Concurrency学习
swift
东坡肘子7 天前
OpenClaw 不错,但我好像没有那么需要 -- 肘子的 Swift 周报 #125
人工智能·swiftui·swift
Swift社区12 天前
LeetCode 391 完美矩形 - Swift 题解
算法·leetcode·swift
升讯威在线客服系统13 天前
从 GC 抖动到稳定低延迟:在升讯威客服系统中实践 Span 与 Memory 的高性能优化
java·javascript·python·算法·性能优化·php·swift
Swift社区13 天前
LeetCode 390 消除游戏 - Swift 题解
leetcode·游戏·swift
东坡肘子14 天前
春晚、机器人、AI 与 LLM -- 肘子的 Swift 周报 #124
人工智能·swiftui·swift
BatmanWayne17 天前
swift-微调补充
人工智能·swift
疯笔码良21 天前
【swiftUI】实现自定义的底部TabBar组件
ios·swiftui·swift
东坡肘子22 天前
祝大家马年新春快乐! -- 肘子的 Swift 周报 #123
人工智能·swiftui·swift