未能在 Swift 中使用结构体 CGPoint

Failed to use CGPoint, the struct, in Swift

我的情况:

我已经学了一段时间 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是C结构体,应该翻译成C结构体。

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

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

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

CGPoint lineOrigins[numberOfLines];

创建 CGPoint 对象的 C 数组。

它写在函数内部,因此它创建了一个局部(堆栈)变量。 该代码只有在 numberOfLines 是编译时常量时才会编译,因为编译器必须在编译时为堆栈上的数组分配固定数量的 space。

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

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

当您像示例中那样定义 C 数组时,编译器会为整个数组创建内存 space,并将变量设置为指向第一个元素的指针。

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

编辑:

类似的 Swift 声明为:

var lineOrigins = [CGPoint]()

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

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