'Int'与'String.Index'不同

Mic*_*ael 5 objective-c ios swift

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

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

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

在swift中它看起来像这样:

let str = backingStore.string
let extendedRange: NSRange = NSUnionRange(range, str.lineRangeForRange(NSMakeRange(NSMaxRange(range), 0)))
Run Code Online (Sandbox Code Playgroud)

但是,由于某种原因,我得到'Int'与'String.Index'不同,我无法弄清楚为什么.任何帮助/见解将不胜感激.


编辑:

如果我桥接我的字符串,它的工作原理:

let str = backingStore.string
let extendedRange: NSRange = NSUnionRange(range, str.bridgeToObjectiveC().lineRangeForRange(NSMakeRange(NSMaxRange(range), 0)))
Run Code Online (Sandbox Code Playgroud)

Jay*_*ik- 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>

另请注意,SwiftRange<T>是开始/结束,而 FoundationNSRange是位置/长度。有多种方法可以在NSRange和之间进行转换Range<Int>,但 aRange<String.Index>是一个不同的故事:String.Index更像是“迭代器”而不是“索引”。

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