Swift中CoreText CTFrameGetLineOrigins的问题

时间:2014-06-26 15:42:42

标签: 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时,编译器会在Cannot convert the expression´s ´Void´to type ´CMutablePointer<CGPoint>行中使用CTFrameGetLineOrigins进行投诉

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)

我必须在CGFrameGetLines函数中使用NSArray,然后转换为Swift数组,并检查ctLinesArray,显示正确检索CTLine个对象

我尝试使用NSMutableArray作为originsArray,结果相同。

知道遗失的是什么?

1 个答案:

答案 0 :(得分:4)

您必须添加地址运算符&以将指针传递给 开始originsArray到函数:

CTFrameGetLineOrigins(ctFrame, range, &originsArray)

参考:Interacting with C APIs 在“使用Swift with Cocoa和Objective-C”一书中:

  

C可变指针

     

当一个函数声明为CMutablePointer<Type>时   参数,它可以接受以下任何一种:

     
      
  • ...
  •   
  • 进出Type[]值,   它作为指向数组开头的指针传递,并且   在通话期间延长了生命周期。
  •   

来自“The Swift Programming Language”一书中的Expressions

  

除了上面列出的标准库运算符,您还可以使用&   紧接在作为传递的变量名称之前   函数调用表达式的输出参数。

添加(正如@ eharo2已经弄明白的那样),originsArray必须有空间 必要数量的元素,可以通过

实现
var originsArray = CGPoint[](count:ctLinesArray.count, repeatedValue: CGPointZero)