我有字符串并确定索引的范围。对于这些范围,我稍后需要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
答案 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