Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中CoreText CTFrameGetLineOriginates存在问题_Swift_Core Text - Fatal编程技术网

Swift中CoreText CTFrameGetLineOriginates存在问题

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”

我有以下代码在Objective-C中工作

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
参数时,它可以接受以下任一项:

  • 输入输出
    类型[]
    值, 作为指向数组开头的指针传递,以及 在呼叫期间延长生存期
在“Swift编程语言”一书中:

除了上面列出的标准库操作符外,还可以使用
&
紧跟在作为 函数调用表达式的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)