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

感谢观赏,再会!😎

相关推荐
君陌笑12 小时前
iOS-小说阅读器功能拆分之笔记划线
ios·swift
FreeCultureBoy1 天前
Swift 与 SwiftUI 学习系列:变量与常量篇 🚀
swiftui·xcode·swift
FreeCultureBoy1 天前
Swift 与 SwiftUI 学习系列: print 函数详解 🚀
swiftui·xcode·swift
依旧风轻1 天前
使用AES加密数据传输的iOS客户端实现方案
ios·swift·aes·network
依旧风轻2 天前
精确计算应用的冷启动耗时
ios·swift·cold start
hzgisme3 天前
iOS 视图实现渐变色背景
ios·cocoa·swift
大熊猫侯佩3 天前
Swift 中强大的 Key Paths(键路径)机制趣谈(上)
swift·序列·语法糖·键路径·keypath·转换为方法·协议扩展
V言微语4 天前
2.2.3 C#中显示控件BDPictureBox 的实现----控件实现
开发语言·c#·swift
concisedistinct4 天前
探索iOS开发语言基础与Xcode工具:从零开始构建你的第一个iOS应用
开发语言·ios·objective-c·xcode·swift