2

ObjectiveC我正在将一些自定义子类移植UIViewSwift今天早上。为了使其更加“面向对象”,我遵循了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' 更改为 just CGContext's 时。它仍然有效。不仅编译,而且正确运行和绘制。为了好玩,我改成了extension CGContextRef. 然而它仍然继续工作。就好像 Swift 足够聪明,可以将它们归结为同一件事。是吗?还是这里发生了一些更微妙/更酷的事情?

4

1 回答 1

4

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

<CoreGraphics/CGContext.h>

typedef struct CGContext *CGContextRef;

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

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

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

于 2015-09-02T00:32:20.390 回答