无法使用类型为 'Range<String.Index>' 的参数列表调用初始值设定项 '(Range<String.Index>)'



更新到 Xcode 10 beta 后,显然是 Swift 4.1.50 附带的,我看到以下错误,我不确定如何修复:

无法使用类型为"(范围<字符串>(("的类型"范围<字符串>"调用初始值设定项

在以下函数中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 中的范围(:

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的初始值设定项。所有这些更改都是 [标准图书馆][在制品]使用条件一致性 (#13342( 提交消除(关闭(可计数范围。

所以这就是为什么

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

不再编译。

如何修复

正如您已经发现的那样,这可以简单地修复为

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

或者只是

let range = start..<self.endIndex

没有类型注释。

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

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

事实证明,范围不必初始化,但可以简单地创建如下:

let range: Range<Index> = start...end

在这种情况下,可以通过将Range<Index>(start..<self.endIndex)替换为来修复代码:

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

我遇到了同样的问题,您可以使用此代码来解决问题 -

让范围 = 开始索引 ..

参考 : https://github.com/Ahmed-Ali/JSONExport/issues/121

我从xcode 9.2迁移到xcode 10.1,然后开始遇到此错误并通过以下方式解决

let range = start...end

相关内容

最新更新