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】:
这里没有什么特别神奇的。 CGContextRef
和 CGContext
只是(几乎)同一事物的不同名称。 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 中一样吗?这是如何运作的?的主要内容,如果未能解决你的问题,请参考以下文章