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

无法为“范围”类型调用初始化程序',其参数类型为'(Range)'

西门品
2023-03-14
问题内容

在更新到Xcode 10 beta(显然是Swift 4.1.50附带)之后,我看到以下错误,但不确定如何解决:

无法使用类型为((Range )’的参数列表来调用类型’Range ‘的初始化程序

在以下功能Range<Index>(start..<self.endIndex)(第3行)中:

func index(of aString: String, startingFrom position: Int? = 0) -> String.Index? {
    let start: String.Index = self.index(self.startIndex, offsetBy: position!)
    let range: Range<Index> = Range<Index>(start..<self.endIndex)
    return self.range(of: aString, options: .literal, range: range, locale: nil)?.lowerBound
}

任何想法如何修复初始化程序?


问题答案:

一些背景:

在Swift 3中,引入了其他范围类型,总共增加了四种(例如,参见Ole Begemann:Swift
3中的Ranges
):

Range, ClosedRange, CountableRange, CountableClosedRange

在Swift 4.2中实现SE-0143条件一致性后,“可计数”变量不再是单独的类型,而是(受约束的)类型别名,例如

 public typealias CountableRange<Bound: Strideable> = Range<Bound>
      where Bound.Stride : SignedInteger

因此,不同范围类型之间的各种转换已被删除,例如

init(_ other: Range<Range.Bound>)

的初始化程序struct Range。所有这些更改都是 [stdlib]
[WIP]使用条件一致性(#13342)
提交消除(Closed)CountableRange的一部分。

这就是为什么

let range: Range<Index> = Range<Index>(start..<self.endIndex)

不再编译。

怎么修

如您所知,可以简单地将其固定为

let range: Range<Index> = start..<self.endIndex

要不就

let range = start..<self.endIndex

没有类型注释。

另一种选择是使用 单面范围 (在带有SE-0172单面范围的 Swift 4中引入):

extension String {
    func index(of aString: String, startingFrom position: Int = 0) -> String.Index? {
        let start = index(startIndex, offsetBy: position)
        return self[start...].range(of: aString, options: .literal)?.lowerBound
    }
}

这是有效的,因为子字符串 与原始字符串self[start...] 共享其索引self



 类似资料:
  • 问题内容: 我有两个问题: 它给出了错误: 它给出了错误: 我不知道该怎么解决。 问题答案: 这里的金额是可选的。您必须确保没有。 仅在不为nil时被调用。 同样的问题。是可选的。

  • 初始化带有类型参数的类时遇到问题。这似乎是Java类型推断的一个缺点,我想知道是否有办法解决这个问题,或者有更好的方法实现这个问题。 编译时错误在中: 构造函数服务 编译成Java7。

  • 我正在开发一个小的android演示应用程序,其中混合了一些java类和接口与kotlin。我想从一个名为MvpViewStateActivity的具有泛型类型参数的java类扩展: 其中只是一个空的java接口: MvpPresenter是这样一个java接口: 和SearchViewActivity(Java): 所以现在我创建了一个kotlin接口: 其中,Item是pojo数据类。 也是用

  • 初始化动画类型的对象时,会收到以下警告。 (警告添加为注释) 这是一张照片 以下是代码摘要: 这是我尝试编译后的日志猫 这里是我使用错误代码的地方 列表视图1。setOnItemClickListener(新的AdapterView.OnItemClickListener(){ 我找不到错误。 我创建了正确的文件夹和文件。在这里。 这是我得到我正在使用的动画代码的地方。 试图创建一个文件夹。收到这

  • 问题内容: 我有一个笼子课: 我试图在另一个类main方法中实例化Cage对象: 我收到错误:笼子是原始类型。泛型Cage的引用应参数化。我尝试了几个想法,但对这种棘手的语法感到困惑:o( 问题答案: 是通用类型,因此您需要指定一个类型参数,例如这样(假设有一个): 您可以使用任何扩展的类型(甚至是自身)。 如果省略type参数,那么在这种情况下最终得到的是。但是,即使这是您想要的,您仍应明确声明

  • 在此输入图像描述 在此输入图像描述 我试图下载IntelliJ和学习静态编程语言,但我得到一个BUG错误之前,我开始,我现在不知道该怎么办... 我试图删除scipts文件夹,但它只是创建了一个新的scipts文件夹,并说了同样的错误。我还重新安装了IntelliJ,这会产生相同的错误 有人能帮我吗?:-) 无法打开初始化脚本“C:\Users\username\AppData\Local\Tem