繁体   English   中英

'Int'与'String.Index'不同

[英]'Int' is not identical to 'String.Index'

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

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的String。

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

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

BidirectionalIndex是一种继承自另一协议ForwardIndex协议。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM