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

0. 概览
在 Swift 的开发中,我们经常要与字符串打交道。其中一个常见的操作就是用特定的“分隔符”来分割字符串,这里分隔符可能不仅仅是字符,而是多字符组成的字符串。
从 iOS 16 开始, 新增了对应的方法来专注此事。不过,对于 iOS 16 之前的系统我们又该何去何从呢?
在本篇博文中您将学到以下内容:
- 0. 概览
- 1. 分割字符串,轻而易举?
- 2. iOS 16 之前的一种解决
- 3. 我们的小目标:兼容所有 iOS!
- 4. iOS 16 之前对于 URL 特殊字符串组件分隔的解决
- 5. 字符串分割一个实际应用
- 总结
相信学完本篇后,小伙伴们对字符串分割的实现又会有更多的理解。
那还等什么呢?Let‘s split it!!!😉
1. 分割字符串,轻而易举?
从 iOS 16 开始 为集合(Collection)新增了一个 split 方法,它可以用和集合元素同样类型的“分隔符”来分割集合本身:

字符串也算一个集合,所以对于用字符串来分割字符串来说这真是恰到好处:
let string = "Hello||World||Dear||hopy!!!"
let parts = string.split(separator: "||")

注意,这里讨论的是用字符串来分割字符串,请不要将其和用字符来分割字符串相混淆,因为后者是 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: "||")

如上代码所示,我们利用 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)}}
}
现在无论在何种版本的系统中,我们都可以直接游刃有余的调用这个新方法了:

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.pngstatic func fixMultipleDoubleSlash(_ urlString: String) -> String {var parts = urlString.splitBy(separator: "//")if parts.count > 2 {_ = parts.remove(at: 1)return parts.joined(separator: "//")}return urlString}
}
我们可以这样调用它:
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 之前和之后如何实现字符串分割字符串的功能,并用把它应用到了实际的例子中。
感谢观赏,再会!😎
相关文章:
Swift 如何打造兼容新老系统的字符串分割(split)方法
0. 概览 在 Swift 的开发中,我们经常要与字符串打交道。其中一个常见的操作就是用特定的“分隔符”来分割字符串,这里分隔符可能不仅仅是字符,而是多字符组成的字符串。 从 iOS 16 开始, 新增了对应的方法来专注此事。不过&am…...
JVM面试必备
目录 JVM三大问题 一、JVM内存区域划分 编辑 二、JVM类加载机制 双亲委派模型(常考) 类加载的格式,类卸载 三、垃圾回收(GC) 具体垃圾回收GC步骤 1.判定对象是否为垃圾 方案1:引用计数 方案2:可达性分析 2.释放对象的…...
战神传奇【我本沉默精修版】win服务端+双端+充值后台+架设教程
搭建资源下载:战神传奇【我本沉默精修版】win服务端双端充值后台架设教程-海盗空间...
安卓手机投屏到电视,跨品牌、跨地域同样可以实现!
在手机网页上看到的视频,也可以投屏到电视上看! 长时间使用手机,难免脖子会酸。这时候,如果你将手机屏幕投屏到大电视屏幕,可以减缓脖子的压力,而且大屏的视觉体验更爽。 假设你有一台安卓手机,…...
python变量名解析总结
1 python变量名解析总结 点号和无点号变量名,用不同的处理方式。 (1) 无点号的变量名,比如X,使用的是作用域。 (2) 有点号的变量名,比如obj.X,使用对象的命名空间。 …...
端口号大揭秘:网络世界的“门牌号”有多牛?
大家好,今天我们来聊一聊网络中的端口号。如果你以为端口号只是冷冰冰的数字,那你就大错特错了。端口号,这些看似枯燥的数字背后,隐藏着一个个生动的故事。 目录 大家好,今天我们来聊一聊网络中的端口号。如果你以为端…...
vue解除数据双向绑定
let obj JSON.parse(JSON.stringify(data));例如,table列表中,点击编辑时,可对val进行如上操作来解除双向绑定...
组件插槽,生命周期,轮播图组件的封装,自定义指令的封装等详解以及axios的卖座案例
3.组件插槽 3-1组件插槽 注意 插槽内容可以访问到父组件的数据作用域,因为插槽内容本身就是在父组件模版中定义的 插槽内容无法访问子组件的数据.vue模版中的表达式只能访问其定义时所处的作用域,这和JavaScript的词法作用域是一致的,换言之: 父组件模版的表达式只能访问父组…...
小美的树上染色
美团2024届秋招笔试第一场编程真题 先提一个小知识:题目中凡是提到树结构都要使用图的存储方式,只有二叉树例外。 分析:在树结构中,孩子和父节点是相邻节点,而父节点可能有多个孩子节点。在染色的过程中,…...
1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行
自己有点笨,查资料查了一周才完美的实现了yolov5在rk3588环境下的运行,在这里写具体步骤希望大家少走弯路。具体步骤如下: 一、yolov5的原代码下载及pt文件转换为onnx文件 1.yolov5的原代码下载及环境搭建 在这里一定要下载正确版本的源代码…...
适用于全部安卓手机的 5 大免费 Android 数据恢复
您是否面临这样一种情况,即在Android设备上丢失了一些重要文件,但不知道应该选择哪种Android数据恢复来取回它们? 如果您以前从未备份过Android数据,则很难解决问题。 本文将介绍排名前5位的免费Android数据恢复软件。 您可以获…...
【案例分享】BenchmarkSQL 5.0 压测 openGauss 5.0.0
一、前言 本次BenchmarkSQL 压测openGauss仅作为学习使用压测工具测试tpcc为目的,并不代表数据库性能如本次压测所得数据。实际生产性能压测,还需结合服务器软硬件配置、数据库性能参数调优、BenchmarkSQL 配置文件参数相结合,是一个复杂的过…...
Linux之 4 种休眠模式
目录 1. Linux之 4 种休眠模式 1. Linux之 4 种休眠模式 # echo standby >/sys/power/state //CPU和RAM在运行 # echo mem > /sys/power/state //挂起到内存(待机),关闭硬 盘、外设等设备 # echo disk > /sys/power/state //挂起到硬盘(休眠),关闭硬盘、外设等设备&…...
homeassiant主题
下载主题 https://github.com/maartenpaauw/home-assistant-community-themes.git 使用file editor到homeassiant路径下,新建文件夹themes文件夹,用terminal新建也可以。 使用file editor上传文件 使用Terminal解压 mkdir themes unzip home-assistan…...
《2020年最新面经》—字节跳动Java社招面试题
文章目录 前言:一面:01、Java基础知识答疑,简单概述一下?02、倒排索引了解吗?使用Java语言怎么实现倒排?03、详细讲解一下redis里面的哈希表,常用的Redis哈希表命名有哪些,举例说明其…...
2.3IP详解及配置
2.3IP详解及配置 一、ip地址组成 IP地址由4部分数字组成,每部分数字对应于8位二进制数字,各部分之间用小数点分开 这是点分 2进制 如果换算为10进制我们称为点分10进制. 每个ip地址由两部分组成网络地址(NetID)和主z机地址(HostID).网络地址表示其属于…...
Python程序打包指南:手把手教你一步步完成
最近感兴趣想将开发的项目转成Package,研究了一下相关文章,并且自己跑通了,走了一下弯路,这里记录一下如何打包一个简单的Python项目,展示如何添加必要的文件和结构来创建包,如何构建包,以及如何…...
Linux yum 使用时提示 获取 GPG 密钥失败Couldn‘t open file RPM-GPG-KEY-EPEL-7
资料 错误提示: no crontab for root - using an empty one 888 原因剖析: 第一次使用crontab -e 命令时会让我们选择编辑器,很多人会不小心选择默认的nano(不好用),或则提示no crontab for root - usin…...
OpenGL_Learn13(材质)
1. 材质 cube.vs #version 330 core layout (location 0) in vec3 aPos; layout (location 0 ) in vec3 aNormal;out vec3 FragPos; out vec3 Normal;uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {FragPosvec3(model*vec4(aPos,1.0));Norma…...
buildadmin+tp8表格操作(1)----表头上方添加按钮和自定义按钮
buildAdmin 的表头上添加一些按钮,并实现功能 添加按钮 <template><!-- buttons 属性定义了 TableHeader 本身支持的顶部按钮,仅需传递按钮名即可 --><!-- 这里的框架自带的 顶部按钮 分别有 刷新 , 添加, 编辑&…...
网盘直链解析工具完整指南:跨平台文件获取解决方案
网盘直链解析工具完整指南:跨平台文件获取解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
AI智能体协同框架agentsync:事件驱动与状态同步实战解析
1. 项目概述与核心价值最近在探索AI智能体(Agent)的协同工作流时,我遇到了一个非常有意思的项目:obielin/agentsync。乍一看这个名字,你可能会联想到“代理同步”,但它的内涵远不止于此。简单来说ÿ…...
观测Taotoken在每日大赛期间API调用的延迟与稳定性表现
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观测Taotoken在每日大赛期间API调用的延迟与稳定性表现 在技术社区组织的每日编程挑战赛期间,开发者们通常会集中、高频…...
ue5 血条 渲染方形的分辨率 血条缩放的问题
项目设置中将Resize PIE Window to Output Resolution直接搜索Resize PIE Window to Output Resolution勾选即可...
告别导入报错!手把手教你用Navicat把Excel数据完美搬进MySQL(含字段超限处理)
从Excel到MySQL:Navicat数据迁移全流程实战指南 数据迁移是开发者和数据分析师日常工作中的高频需求。想象一下这样的场景:市场部门发来一份包含3000条客户信息的Excel表格,需要快速导入到测试环境的MySQL数据库中进行功能验证;或…...
Audacity音频编辑完全手册:从零开始制作专业音频作品
Audacity音频编辑完全手册:从零开始制作专业音频作品 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想制作播客却不知道如何剪辑?需要为视频添加背景音乐但找不到合适的工具?或…...
HoRain云--Lua协程
🎬 HoRain云小助手:个人主页 🔥 个人专栏: 《Linux 系列教程》《c语言教程》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!…...
极域电子教室破解终极指南:如何在机房环境中重获电脑控制权
极域电子教室破解终极指南:如何在机房环境中重获电脑控制权 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 你是否曾在学校机房被极域电子教室的全屏广播困住…...
AI编码助手配置框架:六层缰绳架构实现团队规范与上下文持久化
1. 项目概述:为什么你的AI编码助手总像个“健忘的实习生”? 如果你和我一样,已经深度使用Claude Code、Cursor这类AI编码助手超过半年,那你一定经历过这种“血压升高”的时刻:明明昨天刚跟它详细解释过项目的架构规范…...
Windows键盘记录器:为什么需要、它是什么、以及如何正确使用
Windows键盘记录器:为什么需要、它是什么、以及如何正确使用 【免费下载链接】keylogger Keylogger for Windows. 项目地址: https://gitcode.com/gh_mirrors/keylogg/keylogger 在当今数字化时代,键盘记录器作为系统监控和用户行为分析工具&…...
