未能在 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 lineOrigins[numberOfLines]
的这行代码没有*
创建实例变量,lineOrigins
?
我未经证实的猜测是 CGPoint
是一个结构而不是 Class
,但它对我来说仍然很神秘,创建了一个没有 *
和 [=19= 的实例变量].
还有一点让我困惑的是[numberOfLines]
。 [numberOfLine]
是数组吗?
请教我如何将 CGPoint lineOrigins[numberOfLines];
翻译成 Swift 或者给我一些提示。
非常感谢您的指导和时间。
伊桑·乔
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)
我的情况:
我已经学了一段时间 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
,但它对我来说仍然很神秘,创建了一个没有*
和 [=19= 的实例变量].还有一点让我困惑的是
[numberOfLines]
。[numberOfLine]
是数组吗?请教我如何将
CGPoint lineOrigins[numberOfLines];
翻译成 Swift 或者给我一些提示。
非常感谢您的指导和时间。
伊桑·乔
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)