web-dev-qa-db-ja.com

型 'Range <String.Index>'の初期化子を、型 '(Range <String.Index>)'の引数リストで呼び出すことはできません

明らかに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
}

イニシャライザを修正する方法はありますか?

22
LinusGeffarth

背景:

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と共有するために機能します。

53
Martin R

範囲は初期化する必要はありませんが、次のように簡単に作成できます。

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

この場合、コードはRange<Index>(start..<self.endIndex)を次のように置き換えることで修正されます。

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

私は同じ問題を抱えていました、このコードを使用して問題を修正できます-

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

参照: https://github.com/Ahmed-ALi/JSONExport/issues/121

2
Sushmita Sinha

Xcode 9.2からxcode 10.1に移行し、このエラーに直面し始め、この方法で解決しました

let range = start...end

1
Awais Nasir