[英]'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
是位置/长度。 有一些方法可以在NSRange
和Range<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.