NSRange 从第一次出现到字符串结尾

Posted

技术标签:

【中文标题】NSRange 从第一次出现到字符串结尾【英文标题】:NSRange from first occurrence until end of string 【发布时间】:2016-05-25 15:33:03 【问题描述】:

我正在努力生成一个有效的 NSRange,它似乎不应该这么复杂,所以我猜我使用了错误的方法。这是我想要做的:

我有一个字符串,里面有一些 unicode 字符:

"The quick brown fox\n❄jumped\n❄over the lazy dog"

我想从那个字符创建一个 NSRange 直到字符串的结尾,虽然我可以得到第一次出现的字符的相应索引:

text.rangeOfString("❄")?.startIndex

我似乎无法以一致的格式(我可以传递给NSMakeRange)来实际生成范围。这看起来应该很简单,但我已经被困了一个多小时,试图弄清楚如何让它工作,我一直以 Index 类型结束,我无法转换为整数来转换回到 NSMakeRange 对其第二个元素所需的长度。

理想情况下我会做这样的事情(由于不兼容和不可转换的类型(索引与整数)而无效):

let start = text.rangeOfString("❄")?.startIndex
NSMakeRange(start, text.endIndex - start)

我正在使用 Swift,所以我可以使用 Swift 的Range<String.Index>,如果它能让事情变得更容易的话,虽然它似乎是另一种与 NSRange 不同的范围表示,我不确定两者的兼容性如何(不想碰到Index vs Int的另一个维度)。

【问题讨论】:

将您的字符串转换为 NSString,然后您可以使用 Foundation 的 .rangeOfString(而不是 Swift 的 .rangeOfString),它将返回一个 NSRange。不过要小心,它不能像 Swift 的方法一样使用 Unicode,并且 NSRange 和 Range 不兼容(尽管两者之间有一些技巧可以来回切换)。 NSMakeRange(start, text.characters.count - start) 会变魔术' 感谢 Eric,我认为很多困惑是因为我没有意识到这两个 .rangeOfString 方法是不相关的。你想把它扔到一个答案中,我可以接受吗? 将字符串转换为 NSString 可能是最简单的解决方案(类似问题:***.com/a/26517690/1187415 或此处:***.com/a/27041376/1187415),但您可以将字符串范围转换为 NSRange并返回(完全支持 Unicode):***.com/a/30404532/1187415. 我已经从我的评论中做出了回答,并且还链接到了 Martin R 有用的范围转换帖子。 【参考方案1】:

将您的字符串转换为 NSString。

您将能够使用 Foundation 的 .rangeOfString 而不是 Swift 的 .rangeOfString

基金会的将返回一个 NSRange。

但要小心,它与 Swift 的 Unicode 方法不一样,并且 NSRange 和 Range 不兼容(尽管有 convert them 的方法)。

【讨论】:

以上是关于NSRange 从第一次出现到字符串结尾的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NSRange 中提取整数值?

字符串搜索

判断某个字符串是否出现在另一个字符串的最后面 或者 判断字符串1是否以字符串2结尾

NSRegularExpression如何让NSRange超出范围?

php 常用变量与函数

类-string/Manth/Random/DateTime-及练习