天上风筝在天上飞 發表於 2023-9-28 09:31:39

Swift data范围截取问题解决方案

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、截取字符串的几种方法</li><ul class="second_class_ul"><li>1. 截取前几位</li><li>2. 截取后几位</li><li>3. subData</li><li>4. 下标截取</li></ul><li>二、subData(in:) 报错 EXC_BREAKPOINT</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、截取字符串的几种方法</h2>
<p class="maodian"></p><h3>1. 截取前几位</h3>
<div class="jb51code"><pre class="brush:java;">mobileID.prefix(32)</pre></div>
<p class="maodian"></p><h3>2. 截取后几位</h3>
<div class="jb51code"><pre class="brush:java;">mobileID.suffix(3)</pre></div>
<p class="maodian"></p><h3>3. subData</h3>
<div class="jb51code"><pre class="brush:java;">data.subdata(in: 0..&lt;4)</pre></div>
<p class="maodian"></p><h3>4. 下标截取</h3>
<div class="jb51code"><pre class="brush:java;">data</pre></div>
<p class="maodian"></p><h2>二、subData(in:) 报错 EXC_BREAKPOINT</h2>
<p>原因:Data值(或一般的集合)的索引不一定是从零开始的。</p>
<p>这里有一段代码</p>
<div class="jb51code"><pre class="brush:java;">let array: =
let data = Data(bytes: array)
//问题:请问以下六个的结果是?
data.subdata(in: 3...4).forEach{ print("a \($0)") }
data.subdata(in: 3..&lt;3).forEach{ print("b \($0)") }
data.subdata(in: 3..&lt;4).forEach{ print("c \($0)") }
data.forEach{ print("A \($0)") }
data.forEach{ print("B \($0)") }
data.forEach{ print("C \($0)") }</pre></div>
<p>结果:</p>
<blockquote><p>data.subdata(in: 3...4).forEach{ print(&quot;a \($0)&quot;) }// 报错 Cannot convert value of type &#39;ClosedRange&lt;Int&gt;&#39; to expected argument type &#39;Range&lt;Data.Index&gt;&#39; (aka &#39;Range&lt;Int&gt;&#39;)<br />data.subdata(in: 3..&lt;3).forEach{ print(&quot;b \($0)&quot;) }// 空值<br />data.subdata(in: 3..&lt;4).forEach{ print(&quot;c \($0)&quot;) }// c 4<br />data.forEach{ print(&quot;A \($0)&quot;) }// A 4 A 5<br />data.forEach{ print(&quot;B \($0)&quot;) }// 空<br />data.forEach{ print(&quot;C \($0)&quot;) }// C 4</p></blockquote>
<p>data.subdata(in: 3&hellip;4) 报错原因:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202309/2023092809292716.png" /></p>
<p>此方法要求的传值为Range&lt;Data.Index&gt; (Data.Index其实就是Int)</p>
<p>而 3&hellip;4 实际上是ClosedRange</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202309/2023092809292717.png" /></p>
<p>我们知道,Swift3.0以后,Range有四种:</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202309/2023092809292718.webp" /></p>
<p>而这四种Range并不能在互相之间直接转换因此 data.subdata(in: 3&hellip;4) 就会报上述错误</p>
<p><strong>为什么下标取值既能用CountableClosedRange,也能用CountableRange?</strong></p>
<p>翻阅Swift源代码就知道原因Swift对四种Range都定义了下标取值</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202309/2023092809292719.webp" /></p>
<p>到此这篇关于Swift data范围截取问题的文章就介绍到这了,更多相关Swift data范围截取内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>SwiftUI使用Paths和AnimatableData实现酷炫的颜色切换动画</li><li>Swift使用CoreData时遇到的一些填坑记录</li><li>Swift利用CoreData实现一个上班签到的小工具</li><li>Swift利用CoreData如何存储多种数据类的通讯录</li><li>Swift利用CoreData实现一个通讯录存储详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Swift data范围截取问题解决方案