作为练习,我正在使用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)))
答案 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
是位置/长度。有一些方法可以在NSRange
和Range<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()
方法分别代表'继承者'和'前任'。