Swift中CoreText CTFrameGetLineOriginates存在问题
我有以下代码在Objective-C中工作Swift中CoreText CTFrameGetLineOriginates存在问题,swift,core-text,Swift,Core Text,我有以下代码在Objective-C中工作 NSArray *lines = (NSArray *)CTFrameGetLines((__bridge CTFrameRef)columnFrame); CGPoint origins[[lines count]]; CTFrameGetLineOrigins((__bridge CTFrameRef)columnFrame, CFRangeMake(0, 0), origins); 但当移植到Swift时,编译器会抱怨无法将表达式的“Void”
NSArray *lines = (NSArray *)CTFrameGetLines((__bridge CTFrameRef)columnFrame);
CGPoint origins[[lines count]];
CTFrameGetLineOrigins((__bridge CTFrameRef)columnFrame, CFRangeMake(0, 0), origins);
但当移植到Swift时,编译器会抱怨无法将表达式的“Void”转换为ctFrameGetLineOriginates
行中的类型“CMutablePointer
let nsLinesArray: NSArray = CTFrameGetLines(ctFrame) // Use NSArray to bridge to Array
let ctLinesArray = nsLinesArray as Array
var originsArray: Array<CGPoint> = CGPoint[]()
//var originsArray: NSMutableArray = NSMutableArray.array()
let range: CFRange = CFRangeMake(0, 0)
CTFrameGetLineOrigins(ctFrame, range, originsArray)
让nsLinesArray:NSArray=CTFrameGetLines(ctFrame)//使用NSArray桥接到阵列
让ctLinesArray=nsLinesArray作为数组
var originsArray:Array=CGPoint[]()
//var originsArray:NSMutableArray=NSMutableArray.array()
let range:CFRange=CFRangeMake(0,0)
CTFrameGetLineOrigins(ctFrame、range、Origins数组)
我必须在CGFrameGetLines
函数中使用NSArray,然后转换为Swift数组,检查ctlinearray,显示CTLine
对象被正确检索
我尝试对originsArray使用NSMutableArray
,得到了相同的结果
知道缺少什么吗?您必须添加操作员
&
的地址才能将指针传递到
启动函数的originsaray
:
CTFrameGetLineOrigins(ctFrame, range, &originsArray)
参考:
在“与Cocoa和Objective-C一起使用Swift”一书中:
C可变指针
当函数声明为使用CMutablePointer
参数时,它可以接受以下任一项:
- 李>
- 输入输出
值, 作为指向数组开头的指针传递,以及 在呼叫期间延长生存期类型[]
&
紧跟在作为
函数调用表达式的in out参数
另外(正如@eharo2已经指出的那样,originsArray
必须为
必要数量的元素,可通过
var originsArray = CGPoint[](count:ctLinesArray.count, repeatedValue: CGPointZero)
必须添加运算符
和的地址才能将指针传递到
启动函数的originsaray
:
CTFrameGetLineOrigins(ctFrame, range, &originsArray)
参考:
在“与Cocoa和Objective-C一起使用Swift”一书中:
C可变指针
当函数声明为使用CMutablePointer
参数时,它可以接受以下任一项:
- 李>
- 输入输出
类型[]
值,
作为指向数组开头的指针传递,以及
在呼叫期间延长生存期
在“Swift编程语言”一书中:
除了上面列出的标准库操作符外,还可以使用&
紧跟在作为
函数调用表达式的in out参数
另外(正如@eharo2已经指出的那样,originsArray
必须为
必要数量的元素,可通过
var originsArray = CGPoint[](count:ctLinesArray.count, repeatedValue: CGPointZero)
#Martin R.我已经这样做了,尽管Objective-C版本不使用内存地址,但Swift文档将源代码引用为缓冲区。这样,编译器不会报告任何问题,但我有一个运行时EXEC_BAD_访问错误。@eharo2:好的,我只编译了它。我在文档中添加了一些参考资料,这些资料应该可以解释为什么&
是正确的。但我无法解释为什么它在运行时崩溃。这将需要一个完整的运行CoreText应用程序,而我没有。当您指向时,“&”修复了编译器错误。我找到了一种处理运行时错误的方法,如下所示:我用CGPointZero加载originsArray(CTFrameGetLines报告的每行一个)
@eharo2:您是对的,必须已经有必要数量的元素。您可能可以将创建简化为var originsArray=CGPoint[](count:ctLinesArray.count,repeatedValue:CGPointZero)
。#Martin R.我已经这样做了,即使Objective-C版本不使用内存地址,Swift文档也将源代码引用为缓冲区。这样,编译器不会报告任何问题,但是我有一个运行时EXEC_BAD_访问错误。@eharo2:好的,我只编译了它。我添加了文档中的一些引用这应该可以解释为什么&
是正确的。但我无法解释为什么它会在运行时崩溃。这需要一个完整的运行CoreText应用程序,而我没有。#Martin R.Thx用于其他背景。正如您指出的“&”修复了编译器错误。我找到了一种处理运行时错误的方法,如下所示:我用CGPointZero加载originsArray(CTFrameGetLines报告的每行一个)
@eharo2:您是对的,必须已经有必要数量的元素。您可能可以将创建简化为var originsArray=CGPoint[](count:ctLinesArray.count,repeatedValue:CGPointZero)
。