After updating to Xcode 10 beta, which apparently comes with Swift 4.1.50, I'm seeing the following error which I'm not sure how to fix:
Cannot invoke initializer for type 'Range< String.Index>' with an argument list of type '(Range< String.Index>)'
in the following function at Range<Index>(start..<self.endIndex) (line 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
}
Any idea how to fix the initializer?
Some background:
In Swift 3, additional range types were introduced, making a total of four (see for example Ole Begemann: Ranges in Swift 3):
With the implementation of SE-0143 Conditional conformances in Swift 4.2, the “countable” variants are not separate types anymore, but (constrained) type aliases, for example
and, as a consequence, various conversions between the different range types have been removed, such as the
initializer of
struct Range. All theses changes are part of the [stdlib][WIP] Eliminate (Closed)CountableRange using conditional conformance (#13342) commit.So that is the reason why
does not compile anymore.
How to fix
As you already figured out, this can be simply fixed as
or just
without the type annotation.
Another option is to use a one sided range (introduced in Swift 4 with SE-0172 One-sided Ranges):
This works because the substring
self[start...]shares its indices with the originating stringself.