我编写了一个swift函数,它以String和Range作为参数。如何检查范围对字符串是否有效?
编辑:荒谬的例子
func foo(text: String, range: Range<String.Index>) ->String? {
// what can I do here to ensure valid range
guard *is valid range for text* else {
return nil
}
return text[range]
}
var str = "Hello, world"
let range = str.rangeOfString("world")
let str2 = "short"
let text = foo(str2, range: range!)
答案 0 :(得分:4)
在Swift 3中,这很简单:只需获取字符串的字符范围并调用contains
即可查看它是否包含您的任意范围。
编辑在Swift 4中,范围不再“包含”范围。 Swift 4.2解决方案可能如下所示:
let s = // some string
let r = // some range of String.Index
let ok = r.clamped(to: s.startIndex..<s.endIndex) == r
如果ok
为真,则可以将r
应用于s
。
答案 1 :(得分:1)
不幸的是,当我使用swift 2.2时,我无法测试Matt的解决方案。但是,根据他的想法,我提出了......
func foo(text: String, range: Range<String.Index>) -> String? {
let r = text.startIndex..<text.endIndex
if r.contains(range.startIndex) && r.contains(range.endIndex) {
return text[range]
} else {
return nil
}
}
如果开始和结束指数都没问题,则必须是整个范围。
答案 2 :(得分:0)
雨燕5
extension String {
func hasRange(_ range: NSRange) -> Bool {
return Range(range, in: self) != nil
}
}