Swift data范围截取问题

文章目录

  • 一、截取字符串的几种方法
    • [1. 截取前几位](#1. 截取前几位)
    • [2. 截取后几位](#2. 截取后几位)
    • [3. subData](#3. subData)
    • [4. 下标截取](#4. 下标截取)
  • [二、subData(in:) 报错 EXC_BREAKPOINT](#二、subData(in:) 报错 EXC_BREAKPOINT)

一、截取字符串的几种方法

1. 截取前几位

复制代码
mobileID.prefix(32)

2. 截取后几位

复制代码
mobileID.suffix(3)

3. subData

复制代码
data.subdata(in: 0..<4)

4. 下标截取

复制代码
data[0..<4]

二、subData(in:) 报错 EXC_BREAKPOINT

原因:Data值(或一般的集合)的索引不一定是从零开始的。

这里有一段代码

复制代码
let array:[UInt8] = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]
let data = Data(bytes: array)

//问题:请问以下六个的结果是?
data.subdata(in: 3...4).forEach{ print("a \($0)") }
data.subdata(in: 3..<3).forEach{ print("b \($0)") }
data.subdata(in: 3..<4).forEach{ print("c \($0)") }
data[3...4].forEach{ print("A \($0)") }
data[3..<3].forEach{ print("B \($0)") }
data[3..<4].forEach{ print("C \($0)") }

结果:

复制代码
data.subdata(in: 3...4).forEach{ print("a \($0)") }// 报错 Cannot convert value of type 'ClosedRange<Int>' to expected argument type 'Range<Data.Index>' (aka 'Range<Int>')
data.subdata(in: 3..<3).forEach{ print("b \($0)") }// 空值
data.subdata(in: 3..<4).forEach{ print("c \($0)") }// c 4
data[3...4].forEach{ print("A \($0)") }// A 4 A 5
data[3..<3].forEach{ print("B \($0)") }// 空
data[3..<4].forEach{ print("C \($0)") }// C 4

data.subdata(in: 3...4) 报错原因:

此方法要求的传值为Range<Data.Index> (Data.Index其实就是Int)

而 3...4 实际上是ClosedRange

我们知道,Swift3.0以后,Range有四种:

而这四种Range并不能在互相之间直接转换

因此 data.subdata(in: 3...4) 就会报上述错误

为什么下标取值既能用CountableClosedRange,也能用CountableRange?

翻阅Swift源代码就知道原因

Swift对四种Range都定义了下标取值

相关推荐
Keya21 小时前
lipo 命令行指南
ios·xcode·swift
zhangmeng21 小时前
SwiftUI中如何实现子视图向父视图传递数据?
ios·swiftui·swift
Saafo21 小时前
迁移至 Swift Actors
ios·swift
杂雾无尘2 天前
告别构建错误, iOS 开发架构难题全面解析, 避免 CPU 架构陷阱
ios·swift·客户端
大熊猫侯佩3 天前
探秘 WWDC 25 全新 #Playground 宏:提升 Swift 开发效率的超级神器
xcode·swift·wwdc
移动端小伙伴3 天前
10.推送的扩展能力 — 打造安全的通知体验
swift
移动端小伙伴3 天前
推送的扩展能力 — 打造个性化的通知体验
swift
移动端小伙伴3 天前
远程推送(Remote Push Notification)
swift
移动端小伙伴3 天前
本地通知的精准控制三角:时间、位置、情境
swift
移动端小伙伴3 天前
本地通知内容深度解析 — 打造丰富的通知体验
swift