我已经学习了一段时间的Swift,Swift是我在iOS开发中学到的唯一语言,这意味着我没有系统地学习Objective-C。我可以稍微阅读一下OC Code。
当我尝试将OC项目翻译成Swift项目时,我遇到了CGPoint
问题。
- (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
答案 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)