CGContext 和 CGContextRef 在 Swift 中一样吗?这是如何运作的?

Posted

技术标签:

【中文标题】CGContext 和 CGContextRef 在 Swift 中一样吗?这是如何运作的?【英文标题】:CGContext AND CGContextRef the same in Swift? How does this work? 【发布时间】:2015-09-01 20:57:10 【问题描述】:

今天早上我将一些ObjectiveC 自定义UIView 子类移植到Swift。为了使其更加“面向对象”,我遵循了使用方法扩展CGContext 的示例。例如

extension CGContext 
    func fillColor(color:UIColor) 
        CGContextSetFillColorWithColor(self, color.CGColor)
    

因为我将客观的 C 风格消息(例如 -(void) drawOutline: (CGContextRef) cr ...)转换为 Swift 风格的消息而没有引起太多关注(例如 func drawOutline(cr:CGContextRef) ...),所以我一开始并没有意识到我正在传递 CGContextRef 参数,但已扩展 CGContext(不是 Ref)。但它奏效了!

更奇怪的是,当我将那些 CGContextRef 更改为 CGContext 时。它仍然有效。不仅编译,而且正确运行和绘制。为了好玩,我改成了extension CGContextRef。然而它仍然继续工作。就好像 Swift 足够聪明,可以将它们归结为同一件事。是吗?还是这里发生了一些更微妙/更酷的事情?

【问题讨论】:

Obijective-C 和 Swift。我猜你添加 C 标签只是为了好玩。 不是为了好玩。也许是出于误入歧途。这里提到的ObjectiveC 的部分严格来说是C(记住ObjectiveC 是C 的超集)。 CGContext 是一个严格的 C 不透明结构。 CGContextRef 是指向相同指针的 typedef。我想我做了 C,因为它更多的是关于 Swift 如何翻译 C 部分而不是 ObjectiveC 的问题。 【参考方案1】:

这里没有什么特别神奇的。 CGContextRefCGContext 只是(几乎)同一事物的不同名称。 Swift 只是为你模糊了 typedef。

<CoreGraphics/CGContext.h>

typedef struct CGContext *CGContextRef;

另请参阅 Core Foundation 上的 Using Swift with Cocoa and Objective-C 指南部分:

当 Swift 导入 Core Foundation 类型时,编译器会重新映射这些类型的名称。编译器会从每个类型名称的末尾删除 Ref,因为所有 Swift 类都是引用类型,因此后缀是多余的。

他们只是选择不删除名称的Ref 形式,我猜对于习惯于输入它的老前辈来说:D

【讨论】:

以上是关于CGContext 和 CGContextRef 在 Swift 中一样吗?这是如何运作的?的主要内容,如果未能解决你的问题,请参考以下文章

CGContext 的奇怪错误

iOS绘图CGContextRef详解

如何将图像放在自定义路径中

使用 Quartz 2d / CGContext 绘图和缩放的问题

仅在模拟器中出现 CGContext 错误?

为啥 CGlayerRef 或 CGcontextRef 不能保存在 NSdata 中?