【问题标题】:NSRange from first occurrence until end of stringNSRange 从第一次出现到字符串结尾
【发布时间】: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 可能是最简单的解决方案(类似问题:stackoverflow.com/a/26517690/1187415 或此处:stackoverflow.com/a/27041376/1187415),但您可以将字符串范围转换为 NSRange并返回(完全支持 Unicode):stackoverflow.com/a/30404532/1187415.
  • 我已经从我的评论中做出了回答,并且还链接到了 Martin R 有用的范围转换帖子。

标签: swift cocoa


【解决方案1】:

将您的字符串转换为 NSString。

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

基金会的将返回一个 NSRange。

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

【讨论】:

    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多