/ / Проблеми с миграцията от swift2 към swift3 с диапазони - брой, обхват, swift3

Проблеми с миграцията от swift2 към swift3 с диапазони - брой, обхват, swift3

Имам струни и определям диапазоните на индексите. Ще ми трябва по-късно например .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