无法为类型“范围”调用初始值设定项 '带有类型的参数列表'(范围 )”

问题描述 投票:22回答:4

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

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

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 xcode10 swift4.1.5
4个回答
50
投票

Some background:

在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>)

qazxsw poi的初始化者。所有这些变化都是qazxsw poi提交的一部分。

这就是原因所在

struct Range

不再编译。

How to fix

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

[stdlib][WIP] Eliminate (Closed)CountableRange using conditional conformance (#13342)

要不就

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

没有类型注释。

另一种选择是使用单侧范围(在Swift 4中引入let range: Range<Index> = start..<self.endIndex ):

let range = start..<self.endIndex

这是有效的,因为子字符串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 } } 共享其索引。


5
投票

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

self[start...]

在这种情况下,代码将通过将self替换为:

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

2
投票

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

let range = startIndex .. <characters.index(startIndex,offsetBy:1)

参考:Range<Index>(start..<self.endIndex)


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.