【发布时间】:2015-12-18 04:47:42
【问题描述】:
我正在尝试重写this Objective C method,它具有与 Python 的lstrip(从字符串的左侧删除字符)和rstrip(去除字符串的右侧)类似的功能。
lstrip 版本效果很好:
// this works
func lstrip(st_in: String,
trimSet: NSCharacterSet=NSCharacterSet.whitespaceAndNewlineCharacterSet())-> String {
let wanted=trimSet.invertedSet
if let r=st_in.rangeOfCharacterFromSet(wanted) {
return st_in.substringFromIndex(r.startIndex)
}
return ""
}
我在使用rstrip 版本时遇到了问题。
这就是我所拥有的:
// does not compile
func rstrip(st_in: String,
trimSet: NSCharacterSet=NSCharacterSet.whitespaceAndNewlineCharacterSet())-> String {
let wanted=trimSet.invertedSet
let tgt=String(st_in.characters.reverse())
if let r=tgt.rangeOfCharacterFromSet(wanted) {
// st_in.characters.count - r.startIndex
return st_in.substringToIndex(st_in.startIndex.advancedBy((st_in.characters.count as Int) - (r.startIndex as Int)))
}
return ""
}
问题:
-
.rangeOfCharacterFromSet的 Swift 版本似乎不支持options:NSBackwardsSearch-- 我在st_in.characters.reverse()上使用前向搜索,这似乎可以工作; - 主要问题(我的问题是)
st_in.substringToIndex(st_in.startIndex.advancedBy((st_in.characters.count as Int) - (r.startIndex as Int)))无法编译。我可以在调试器中看到这些值是正确的,但是r.startIndex是Index类型,我不能直接将该值用于算术,也不能将其强制为 Int 值,也不能访问我在其中看到的价值。
所以在调试器中给出这个:
56> st
$R33: String = " \t\n I needz trimin'¡ \t\n\n\n\n"
57> String(st.characters.reverse())
$R34: String = "\n\n\n\n\t ¡'nimirt zdeen I \n\t "
58> String(st.characters.reverse()).rangeOfCharacterFromSet(trimSet.invertedSet)!.startIndex
$R35: Index = {
_base = {
_position = 9
_core = {
_baseAddress = 0x0000000101207ee0
_countAndFlags = 9223372036854775839
_owner = Some {
instance_type = 0x0000000101207ec0
}
}
}
_lengthUTF16 = 1
}
您可以在 Index 结构中看到 _position=9 —— 这正是我在 st_in.substringToIndex(st_in.startIndex.advancedBy(st_in.characters.count - r.startIndex)) 中所需要的,但我不知道如何在 Swift 中访问它。
想法?
【问题讨论】:
标签: objective-c string swift swift2