明らかにSwift 4.1.50に付属しているXcode 10ベータ版に更新した後、修正方法がわからない次のエラーが表示されます。
型 '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 3では、合計4つの追加の範囲タイプが導入されました(たとえば、 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
の初期化子。これらの変更はすべて [stdlib] [WIP] Eliminate(Closed)CountableRange using conditional conformance(#13342) commitの一部です。
それが理由です
let range: Range<Index> = Range<Index>(start..<self.endIndex)
もうコンパイルしません。
既に理解したように、これは単純に次のように修正できます。
let range: Range<Index> = start..<self.endIndex
あるいは単に
let range = start..<self.endIndex
タイプ注釈なし。
もう1つのオプションは、片側範囲を使用することです(-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
私は同じ問題を抱えていました、このコードを使用して問題を修正できます-
let range = startIndex .. <characters.index(startIndex、offsetBy:1)
Xcode 9.2からxcode 10.1に移行し、このエラーに直面し始め、この方法で解決しました
let range = start...end