Swift 中的 CGContext 和 CGContextRef 是否相同?这是如何运作的?

CGContext AND CGContextRef the same in Swift? How does this work?

我今天早上将一些 ObjectiveC 自定义 UIView 子类移植到 Swift。想要让它变得更多 "object oriented",我正在按照使用方法扩展 CGContext 的示例进行操作。例如

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

因为我在将 objective C 风格的消息(例如 -(void) drawOutline: (CGContextRef) cr {...})转换为 Swift 风格的消息时没有太注意(例如 func drawOutline(cr:CGContextRef) {...}),所以我没有起初我没有意识到我正在传递 CGContextRef 参数,但扩展了 CGContext(不是 Ref)。但它奏效了!

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

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

<CoreGraphics/CGContext.h>

typedef struct CGContext *CGContextRef;

另请参阅 Using Swift with Cocoa and Objective-C 核心基础指南部分:

When Swift imports Core Foundation types, the compiler remaps the names of these types. The compiler removes Ref from the end of each type name because all Swift classes are reference types, therefore the suffix is redundant.

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