无法在Swift中使用CGPoint结构

时间:2015-06-09 14:16:27

标签: swift cgpoint

我的情况:

我已经学习了一段时间的Swift,Swift是我在iOS开发中学到的唯一语言,这意味着我没有系统地学习Objective-C。我可以稍微阅读一下OC Code。

当我尝试将OC项目翻译成Swift项目时,我遇到了CGPoint问题。

Objective-C代码:

- (void)drawFramesetter:(CTFramesetterRef)framesetter
   attributedString:(NSAttributedString *)attributedString
          textRange:(CFRange)textRange
             inRect:(CGRect)rect
            context:(CGContextRef)c
{
           .
           .

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, textRange, path, NULL);
CFArrayRef lines = CTFrameGetLines(frame);
NSInteger numberOfLines = CFArrayGetCount(lines);
CGPoint lineOrigins[numberOfLines];  // *** The place I had been obstructed! ***

           .
           .
           .
}

我的问题:

  • 我不知道为什么这行声明为CGPoint lineOrigins[numberOfLines]的代码没有*来创建实例变量lineOrigins

    我未经证实的猜测是CGPoint是一个结构而不是Class,但对我来说,创建一个没有*=的实例变量仍然是如此神秘。

  • 让我困惑的另一点是[numberOfLines][numberOfLine]是一个数组吗?

  • 请教我如何将CGPoint lineOrigins[numberOfLines];翻译成Swift或给我一些提示。


非常感谢您的指导和时间。

Ethan Joe

2 个答案:

答案 0 :(得分:1)

CGPoint是一个C结构,应该转换为C结构。

CGPoint lineOrigins [...]是一个名为lineOrigins的局部变量,它是一个struct CGPoint数组。

CGPoint lineOrigins [numberOfLines]是一个名为lineOrigins的局部变量,它是一个带有numberOfLines元素的struct CGPoint数组。

有一个数组init方法,您可以在其中传递数组元素的数量,以及一个重复的数组元素。

答案 1 :(得分:1)

该行

CGPoint lineOrigins[numberOfLines];

创建一个CGPoint对象的C数组。

它写在函数内部,因此它创建了一个本地(堆栈)变量。 该代码仅在numberOfLines是编译时常量时编译,因为编译器必须在编译时为堆栈上的数组分配固定数量的空间。

C结构很简单"模板"将一块内存解释为包含一个或多个标量值。这些值按顺序存储在内存中。

C数组也是一种查看内存块的方式,作为一个或多个标量事物的连续序列。"那些标量事物可以是简单的标量,如整数,也可以是结构。

在您的示例中定义C数组时,编译器为完整数组创建内存空间,并将变量设置为指向第一个元素的指针。

lineOrigins的类型实际上是"指向CGPoint"的指针。在C中,数组类型和指向该类型对象的指针是可互换的。它有点像Swift不安全的缓冲区指针。没有范围检查。

编辑:

类似的Swift声明将是:

var lineOrigins = [CGPoint]()

或者,用一堆零点预先填充它:

var lineOrigins = [CGPoint](count: numberOfLines, repeatedValue: CGPointZero)