欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Swiftdata范围截取问题解决方案,

来源: 开发者 投稿于  被查看 20147 次 评论:232

Swiftdata范围截取问题解决方案,


目录
  • 一、截取字符串的几种方法
    • 1. 截取前几位
    • 2. 截取后几位
    • 3. subData
    • 4. 下标截取
  • 二、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都定义了下标取值

    到此这篇关于Swift data范围截取问题的文章就介绍到这了,更多相关Swift data范围截取内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

    您可能感兴趣的文章:
    • SwiftUI使用Paths和AnimatableData实现酷炫的颜色切换动画
    • Swift使用CoreData时遇到的一些填坑记录
    • Swift利用CoreData实现一个上班签到的小工具
    • Swift利用CoreData如何存储多种数据类的通讯录
    • Swift利用CoreData实现一个通讯录存储详解

    用户评论