今天早上我把一些自定义的子类移植到了。为了使它更“面向对象”,我遵循了用方法扩展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) {...}
。但它仍然在继续工作。就好像斯威夫特足够聪明,把它们归结为同样的东西。它是?或者这里有什么更微妙/更酷的事情吗? 最佳答案
这里没有什么特别神奇的。对于(几乎)相同的事物,CGContextRef
和CGContext
只是不同的名称。斯威夫特只是为你模糊了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/