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 № 1W 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