无法使用类型为“(Range<String.Index>)”的参数列表调用类型 'Range<String.Index>' 的初始值设定项
Cannot invoke initializer for type 'Range<String.Index>' with an argument list of type '(Range<String.Index>)'
更新到 Xcode 10 beta 后,显然是 Swift 4.1.50 附带的,我看到以下错误,我不确定如何修复:
Cannot invoke initializer for type 'Range< String.Index>' with an argument list of type '(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
}
知道如何修复初始值设定项吗?
事实证明,范围不必初始化,只需按如下方式创建即可:
let range: Range<Index> = start...end
在这种情况下,可以通过将 Range<Index>(start..<self.endIndex)
替换为:
来修复代码
let range: Range<Index> = start..<self.endIndex
一些背景:
在Swift3中,引入了额外的范围类型,使一共
四个(参见示例 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
.
我遇到了同样的问题,您可以使用此代码解决问题 -
let range = startIndex ..< characters.index(startIndex, offsetBy: 1)
我从 xcode 9.2 迁移到 xcode 10.1 然后开始遇到这个错误并通过这种方式解决
let range = start...end
更新到 Xcode 10 beta 后,显然是 Swift 4.1.50 附带的,我看到以下错误,我不确定如何修复:
Cannot invoke initializer for type 'Range< String.Index>' with an argument list of type '(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
}
知道如何修复初始值设定项吗?
事实证明,范围不必初始化,只需按如下方式创建即可:
let range: Range<Index> = start...end
在这种情况下,可以通过将 Range<Index>(start..<self.endIndex)
替换为:
let range: Range<Index> = start..<self.endIndex
一些背景:
在Swift3中,引入了额外的范围类型,使一共 四个(参见示例 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
.
我遇到了同样的问题,您可以使用此代码解决问题 -
let range = startIndex ..< characters.index(startIndex, offsetBy: 1)
我从 xcode 9.2 迁移到 xcode 10.1 然后开始遇到这个错误并通过这种方式解决
let range = start...end