从swift2迁移到带有范围的swift3的问题

时间:2016-07-08 09:42:12

标签: count range swift3

我有字符串并确定索引的范围。对于这些范围,我稍后需要func copy(dst, src []Type) int .last。我应该如何初始化字符串的范围,以便能够获得这些范围的功能.count .last(这在swift2中很明显,但在swift3中却不明显)?

例如,我经常在swift2的代码中使用.count作为字符串范围,就像这样

.count

现在无法在swift3

中执行此操作
var str = "Hello, playground"

let myRange = str.rangeOfString("Hello")

let myCountOfRange = myRange.count

1 个答案:

答案 0 :(得分:2)

在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的限制。讨论了集合和索引的新模型here

如果您想将范围存储在数组中并在其上调用.count.last,则可以在仍有权访问时将Range<Index>转换为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