我在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,结果相同。
知道遗失的是什么?
答案 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)