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

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

因为我将目标C样式的消息(例如UIView)转换为Swift样式的消息,而没有太多关注(例如Swift),所以起初我没有意识到我传递的是CGContext参数,但扩展了-(void) drawOutline: (CGContextRef) cr {...}(而不是ref)。但它起作用了!
更奇怪的是,当我把它们改成“只是”的时候,它仍然起作用。不仅编译,而且正确地运行和绘制。为了好玩,我改为func drawOutline(cr:CGContextRef) {...}。但它仍然在继续工作。就好像斯威夫特足够聪明,把它们归结为同样的东西。它是?或者这里有什么更微妙/更酷的事情吗?

最佳答案

这里没有什么特别神奇的。对于(几乎)相同的事物,CGContextRefCGContext只是不同的名称。斯威夫特只是为你模糊了typedef。

<CoreGraphics/CGContext.h>

typedef struct CGContext *CGContextRef;

也见核心基础上的Using Swift with Cocoa and Objective-C导引部分:
当Swift导入核心基础类型时,编译器重新映射这些类型的名称。由于所有swift类都是引用类型,因此编译器会从每个类型名称的末尾删除ref,因此后缀是多余的。
他们只是选择了不取下名字的Ref形式,我想对于那些习惯于输入它的老前辈来说是这样的:d

关于swift - CGContext和CGContextRef在Swift中一样吗?这是如何运作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32340795/

10-11 22:07
查看更多