当前位置: 首页 > 面试题库 >

当不涉及Int时,为什么String.subscript(_ :)要求类型String.Index和Int相等?

郎魁
2023-03-14
问题内容

我无法理解Xcode在此行面临的问题:

iteration.template = template[iterationSubstring.endIndex...substring.startIndex]

template是一个StringiterationSubstringsubstringSubstringtemplate。Xcode用以下消息突​​出显示方括号:

下标’subscript(_ :)’要求类型’Substring.Index’和’Int’是等效的

错误消息对我来说没有任何意义。我尝试Substring通过创建Range<String.Index>带有[template.startIndex...template.endIndex]下标的来获得。这有Int什么关系?为什么相同的模式在其他地方也起作用?

Xcode操场代码重现该问题:

import Foundation
let template = "This is an ordinary string literal."

let firstSubstringStart = template.index(template.startIndex, offsetBy: 5)
let firstSubstringEnd = template.index(template.startIndex, offsetBy: 7)
let firstSubstring = template[firstSubstringStart...firstSubstringEnd]

let secondSubstringStart = template.index(template.startIndex, offsetBy: 10)
let secondSubstringEnd = template.index(template.startIndex, offsetBy: 12)
let secondSubstring = template[secondSubstringStart...secondSubstringEnd]

let part: String = template[firstSubstring.endIndex...secondSubstring.startIndex]

毕竟,我有一个模板字符串和它的两个子字符串。我想要一个String从第一个结尾Substring到第二个开始的范围Substring


问题答案:

当前版本的Swift使用Substring切片的结构String

错误似乎是误导性的,如果你要一个(范围下标)分配发生SubstringString变化。

要解决该错误,请StringSubstring

iteration.template = String(template[iterationSubstring.endIndex...substring.startIndex])

但是,强烈建议您不要使用具有不同字符串(iterationSubstringsubstring)的索引来创建范围。切片主字符串,保留索引。

第二个(同时删除)示例中的崩溃是因为字符串的最后一个字符 位于索引beforeendIndex,它是

template[template.startIndex..<template.endIndex]

或更短

template[template.startIndex...]


 类似资料:
  • 问题内容: 我想声明一个type 。 为什么以下原因给我一个错误: 但是以下工作原理: ? 问题答案: 只能引用类型,不能引用基元。是一类,而不是原始的。 声明时,您将创建一个将存储类型而不是原始类型的。 如果您想了解基本类型和引用类型之间的区别,请查看http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

  • 我一直在做一些欧拉项目练习,以提高我的C语言知识。 我编写了以下函数: 这将在17毫秒内计算。 但是,如果我改变路线 自 计算在2毫秒内完成。我是否遗漏了< code>pow(int,int)的一些明显的实现细节,导致第一个表达式的计算速度如此之慢?

  • 当涉及到变量函数时,为什么参数会被提升,例如浮点被提升为双ext,以及它们的提升顺序是什么? 可变参数-cppreference.com 当调用变量函数时,在左值到右值、数组到指针和函数到指针的转换之后,作为变量参数列表一部分的每个参数都会经历额外的转换,称为默认参数提升: std::nullptr_t转换为无效* 浮点参数转换为浮点提升中的双精度 bool、char、短枚举和非作用域枚举被转换为

  • 问题内容: 在我的Linux机器上,是一个普通的旧机器。DO 拥有一种特殊的原子质量? 问题答案: C99 仅符合非常小的“原子性”定义,因为 C99没有并发概念 ,只有可中断性。(C2011添加了一个并发模型,并使用它来保证更强的类型;但是,AFAIK 保持不变,因为其 存在的理由 仍然是与信号处理程序通信,而不是跨线程。) 这就是C99所说的: (第7.14节,第2段)定义的类型为,它是对象的

  • 在制作一个方法将一个新创建的表单放置在我屏幕上的一个完全随机的位置上而不超出所述屏幕的界限时,我有一个有趣的代码契约消息,声明...

  • 问题内容: 我有这个专栏 但是当我插入类似的东西时,我得到了 应该在那里允许有10位数字,对不对? 如何正确执行此操作? 问题答案: Int具有最大值范围: 因此,由于溢出,您将获得最大值。使用bigint代替,它有8个字节,您会没事的。 http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html#integer- types