'诠释'与' String.Index'不相同

时间:2014-06-06 02:01:52

标签: ios objective-c swift

作为练习,我正在使用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)))

2 个答案:

答案 0 :(得分: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更像是一个&#34;迭代器&#34;而不是&#34;索引&#34;。

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

答案 1 :(得分:0)

好奇自己,我Cmd +点击String.Index并发现它实际上被定义为struct类型中的extension

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

BidirectionalIndex是一种继承自其他协议ForwardIndex

的协议

我认为succ()pred()方法分别代表'继承者'和'前任'。