/ / Problemy z migracją z Swift2 do Swift3 z zakresami - Count, Range, Swift3

Problemy z migracją z Swift2 do Swift3 z zakresami - Count, Range, Swift3

Mam ciągi znaków i określam zakresy indeksów. Będę potrzebował później na przykład .last .count dla tych zakresów. Jak powinienem zainicjować zakres dla łańcucha, aby móc uzyskać funkcjonalność .last .count dla tych zakresów (co jest oczywiste w swift2, ale nie w swift3)?

Na przykład często korzystam z .count dla zakresu ciągów w moim kodzie w swift2, w ten sposób

var str = "Hello, playground"

let myRange = str.rangeOfString("Hello")

let myCountOfRange = myRange.count

Teraz nie można tego zrobić w swift3

var str = "Hello, playground"

let myRange = str.range(of: "Hello")

let myCountOfRange = myRange.count // type index does not conform to protocol strideable

Odpowiedzi:

2 dla odpowiedzi № 1

W Swift3, aby znaleźć rozmiar zasięgu, możesz:

var str = "Hello, playground"

let myRange = str.range(of: "Hello")

let myCountOfRange = str[myRange!].characters.count

Nie wiem, czy to najlepszy sposób, ale działa.

Alternatywnie:

let myCountOfRange = str.distance(from: myRange!.lowerBound, to: myRange!.upperBound)

Oba wymagają dostępu do oryginalnego zbioru (tj. Łańcucha), a to najwyraźniej jest ograniczeniem Swift 3. Omawiany jest nowy model zbiorów i indeksów tutaj.


Jeśli chcesz zapisać zakresy w tablicy i zadzwonić .count i .last na nich możesz przekonwertować Range<Index> do a CountableRange<Int> dopóki nadal masz dostęp do kolekcji:

var str = "Hello, playground"

let myRange = str.range(of: "Hello")!

let lb = str.distance(from: str.startIndex, to: myRange.lowerBound) as Int
let ub = str.distance(from: str.startIndex, to: myRange.upperBound) as Int

let newRange = lb..<ub
newRange.count  // 5
newRange.last   // 4