Perché Swift non consente direttamente gli intervalli di sottoscrizione e intero di Int String?

3

Se ho una stringa:

let str = "Hello world"

Sembra abbastanza ragionevole poter estrarre un personaggio:

let thirdChar = str[3]

Tuttavia, non è legale. Invece, devo usare la sintassi estremamente ottusa:

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

Allo stesso modo, perché% non è str[0..<3] o str[0...2] legale? L'intento è chiaro.

È abbastanza facile creare estensioni a String che supportano tali espressioni:

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]
  }
}

Non dovrebbe essere parte della lingua? Sembra un gioco da ragazzi.

    
posta Duncan C 09.12.2017 - 21:11
fonte

1 risposta

8

Le stringhe rapide sono composte da caratteri. I caratteri possono essere costituiti da un numero qualsiasi di punti di codice Unicode. Se hai una stringa molto lunga e vuoi accedere al milionesimo personaggio, dovresti attraversare la stringa di caratteri da 1 milione di interi , perché non hai idea di quanti codepoint hai.

Per ottime ragioni, Apple non vuole rendere la funzionalità altamente inefficiente parte della lingua. E perché vorresti ottenere il terzo personaggio di "Hello, world"? In pratica, non è qualcosa che tu voglia mai. Potresti volere "i caratteri prima della virgola", che ottieni utilizzando gli intervalli di caratteri.

    
risposta data 09.12.2017 - 23:41
fonte

Leggi altre domande sui tag