无法使用类型为“(Range <string.index>)”的参数列表调用类型“Range <string.index>”的初始值设定项

时间:2018-06-06 07:25:52

标签: swift xcode10 swift4.1.5

更新到Xcode 10 beta后,显然是随Swift 4.1.50一起提供的,我看到以下错误,我不知道如何修复:

  

无法为类型'Range&lt;调用初始值设定项String.Index&GT;”使用类型'(Range&lt; String.Index&gt;)'

的参数列表

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
}

知道如何修复初始化程序吗?

4 个答案:

答案 0 :(得分:49)

一些背景:

在Swift 3中,引入了额外的范围类型,总计 四个(参见例如Ole Begemann: Ranges in Swift 3):

Range, ClosedRange, CountableRange, CountableClosedRange

在Swift 4.2中实现SE-0143 Conditional conformances,“可数”变体 不再是单独的类型,而是(约束的)类型别名,例如

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

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

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

struct Range的初始化程序。所有这些变化都是其中的一部分 [stdlib][WIP] Eliminate (Closed)CountableRange using conditional conformance (#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 One-sided Ranges):

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

答案 1 :(得分:5)

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

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

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

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

答案 2 :(得分:2)

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

让范围= startIndex ..

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

答案 3 :(得分:0)

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

let range = start...end