it-swarm-ja.com

SwiftでInt Stringの添え字と整数の範囲を直接許可しないのはなぜですか?

文字列がある場合:

let str = "Hello world"

文字を抽出できるのはかなり合理的だと思われます。

let thirdChar = str[3]

ただし、これは合法ではありません。代わりに、非常にあいまいな構文を使用する必要があります。

let thirdChar = str[str.index(str.startIndex, offsetBy: 2)]

同様に、なぜstr[0..<3]またはstr[0...2]合法ですか?意図は明確です。

これらの式をサポートするStringの拡張を作成するのは簡単です。

extension String {

  //Allow string[Int] subscripting
  subscript(index: Int) -> Character {
    return self[self.index(self.startIndex, offsetBy: index)]
  }

  //Allow open ranges like `string[0..<n]`
  subscript(range: Range<Int>) -> Substring {
    let start = self.index(self.startIndex, offsetBy: range.lowerBound)
    let end = self.index(self.startIndex, offsetBy: range.upperBound)
    return self[start..<end]
  }

  //Allow closed integer range subscripting like `string[0...n]`
  subscript(range: ClosedRange<Int>) -> Substring {
    let start = self.index(self.startIndex, offsetBy: range.lowerBound)
    let end = self.index(self.startIndex, offsetBy: range.upperBound)
    return self[start...end]
  }
}

それは言語の一部ではないでしょうか?非常に簡単なようです。

4
Duncan C

Swiftの文字列は文字でできています。文字は、任意の数のUnicodeコードポイントで構成できます。非常に長い文字列があり、100万番目の文字にアクセスする場合は、コードポイントの数がわからないため、whole 100万文字の文字列をトラバースする必要があります。

Appleは、非常に非効率的な機能を言語の一部にしたくないのです。そして、なぜ「Hello、world」の3番目の文字を取得したいのですか?実際には、文字範囲を使用して取得する「コンマの前の文字」が必要な場合があります。

9
gnasher729