gpt4 book ai didi

objective-c - Swift 版本的 Objective C rstrip : index problems

转载 作者:搜寻专家 更新时间:2023-11-01 07:28:26 25 4
gpt4 key购买 nike

我正在尝试重写 this Objective C method具有与 Python 的 lstrip 相似的功能(从字符串的 LH 中删除字符)和 rstrip (去除一串字符的 RH)。

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 ""
}

问题:

  1. .rangeOfCharacterFromSet 的 Swift 版本好像不支持options:NSBackwardsSearch -- 我在 st_in.characters.reverse() 上使用前向搜索这似乎有效;
  2. 主要问题(我的问题是)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
}

你可以看到_position=9在索引结构中——正是我在 st_in.substringToIndex(st_in.startIndex.advancedBy(st_in.characters.count - r.startIndex)) 中需要的但我不知道如何在 Swift 中访问它。

想法?

最佳答案

rangeOfCharacterFromSet() 确实支持从源字符串末尾开始搜索,但 Objective-C NSBackwardsSearch 被导入到Swift 作为.BackwardsSearch:

func rstrip(st_in: String,
trimSet: NSCharacterSet = NSCharacterSet.whitespaceAndNewlineCharacterSet())-> String {
let wanted = trimSet.invertedSet
if let r = st_in.rangeOfCharacterFromSet(wanted, options: .BackwardsSearch) {
return st_in.substringToIndex(r.endIndex)
}
return ""
}

例子:

let s1 = " foo bar      "
let s2 = rstrip(s1)

print(">\(s1)<")
print(">\(s2)<")

// Output:
// > foo bar <
// > foo bar<

所以不需要对反转的字符串进行操作。但无论如何要回答你的问题:这就是它的工作方式:

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) {
let length = tgt.startIndex.distanceTo(r.startIndex)
return st_in.substringToIndex(st_in.endIndex.advancedBy(-length))
}
return ""
}

不是将字符串索引转换Int(无法编译),distanceTo() 用于将长度计算为 Distance(恰好是 String.CharacterViewInt),that 可以用于算术,例如-长度

关于objective-c - Swift 版本的 Objective C rstrip : index problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34348698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com