Имам струни и определям диапазоните на индексите. Ще ми трябва по-късно например .last
.count
за тези диапазони. Как трябва да се инициализира диапазонът за низ, за да може да се получи функционалност .last
.count
за тези диапазони (това е очевидно в бързи2, но не и в бързи3)?
Например често използвам .count
за диапазон от низове в моя код в swift2, като това
var str = "Hello, playground"
let myRange = str.rangeOfString("Hello")
let myCountOfRange = myRange.count
Сега не е възможно да се направи това бързо
var str = "Hello, playground"
let myRange = str.range(of: "Hello")
let myCountOfRange = myRange.count // type index does not conform to protocol strideable
Отговори:
2 за отговор № 1В Swift3, за да намерите размера на диапазона, който можете да направите:
var str = "Hello, playground"
let myRange = str.range(of: "Hello")
let myCountOfRange = str[myRange!].characters.count
Не знам дали това е най-добрият начин, но работи.
Като алтернатива:
let myCountOfRange = str.distance(from: myRange!.lowerBound, to: myRange!.upperBound)
И двамата изискват достъп до оригиналната колекция (т.е. низ) и очевидно е ограничение на Swift 3. Новият модел за колекции и индекси се обсъжда тук.
Ако искате да запазите диапазоните в масив и да повикате .count
и .last
върху тях можете да конвертирате Range<Index>
до a CountableRange<Int>
докато все още имате достъп до колекцията:
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