小编典典

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

swift

在更新到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
}

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


阅读 283

收藏
2020-07-07

共1个答案

小编典典

一些背景:

在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

2020-07-07