【问题标题】:'Int' is not identical to 'String.Index'“Int”与“String.Index”不同
【发布时间】:2014-06-06 02:01:51
【问题描述】:

作为练习,我正在使用 Swift 重写我的一个应用程序。

在 Objective-C 中,我有以下代码行:

NSRange extendedRange = NSUnionRange(range, [[self.backingStore string]lineRangeForRange:NSMakeRange(NSMaxRange(range), 0)]);

在swift中它看起来像这样:

let str = backingStore.string
let extendedRange: NSRange = NSUnionRange(range, str.lineRangeForRange(NSMakeRange(NSMaxRange(range), 0)))

但是,由于某种原因,我得到的“Int”与“String.Index”不同,我不知道为什么。任何帮助/见解将不胜感激。


编辑:

如果我桥接我的弦,它会起作用:

let str = backingStore.string
let extendedRange: NSRange = NSUnionRange(range, str.bridgeToObjectiveC().lineRangeForRange(NSMakeRange(NSMaxRange(range), 0)))

【问题讨论】:

  • 字符串的索引可能是一个无符号整数...
  • 你可能想看看这里的讨论:stackoverflow.com/questions/24029163/…
  • @connor,我以前看过那篇文章...我认为它没有回答我的问题...

标签: ios objective-c swift


【解决方案1】:

Swift 字符串与 Foundation 字符串不同:它们可以被桥接,并且它们可能具有共同的方法名称,但这并不意味着它们应该被视为兼容。下面是Swift.String.lineRangeForRange的类型定义的两个视图。

Swift.String.lineRangeForRange (Swift.String)(Swift.Range<Swift.String.Index>) -> Swift.Range<Swift.String.Index>

String -> (Range<String.Index>) -> Range<String.Index>

还要注意 Swift 的 Range<T> 是开始/结束,而 Foundation 的 NSRange 是位置/长度。有多种方法可以在 NSRangeRange<Int> 之间进行转换,但 Range<String.Index> 是另一回事:String.Index 更像是“迭代器”而不是“索引”。

我想说的是(我对这类事情非常务实)是,如果你有一个基于 Objective-C 字符串语义的代码块,那么继续使用它们可能会更好一会儿:让你的代码运行起来,然后再评估更改为 Swift 的字符串。

【讨论】:

    【解决方案2】:

    我自己很好奇,我 Cmd+点击了 String.Index 并发现它实际上被定义为 structextension 类型中:

    extension String : Collection {
        struct Index : BidirectionalIndex {
            func succ() -> String.Index
            func pred() -> String.Index
        }
    

    BidirectionalIndex 是从另一个协议ForwardIndex 继承的协议。

    我假设succ()pred() 方法分别代表“继任者”和“前任者”。

    【讨论】:

      猜你喜欢
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 2012-06-14
      • 1970-01-01
      相关资源
      最近更新 更多