2014-08-29 69 views
21

在Swift中,不需要prefix classes,因为它们的模块充当命名空间。前缀扩展函数

什么是前缀扩展功能?例如:

extension UIImage { 

    public func hnk_hasAlpha() -> Bool { ... } 

} 

一方面,Swift不是动态的,所以碰撞会产生编译错误。

但是,如果编译后的代码在未来的iOS/OS X版本中运行,而我的扩展方法之一被添加,会发生什么情况?即使它们具有相同的签名,不同模块中的方法是否会被视为不同的符号?

如果扩展类是NSObject子类或纯Swift类,它会有所作为吗?

+0

为什么您认为向Apple提供的课程添加功能是一个好主意?为什么不写一个函数。这对于使用代码的未来开发者来说很明显。或子类。 – zaph 2014-08-29 12:03:45

+12

这个问题的技术方面与这个问题的技术方面无关,Swift是如何处理这种碰撞的。也就是说,我认为扩展Apple类有助于在限制符号范围的同时为函数提供更好的上下文,并且实现自定义协议而不诉诸包装对象等等。 – hpique 2014-08-29 12:37:35

回答

20

有一些微妙的位置:Objective-C的类型

扩展实现Objective-C的类别,与所有的暗示。

但是,Swift类型的扩展只在导入时才可见。这意味着你不能不小心踩到一个私有系统方法(无论是现在还是将来推出的方法),并且如果系统引入了一个与你的名字相同的公共方法,你将在编译时失败你重建,但你现有的应用程序不会中断。

+0

谢谢。你有资源吗? – hpique 2014-08-29 22:42:26

+2

不记得了,tbh。开发论坛的一些组合和与迅速开展工作的人交谈。 – 2014-08-30 00:20:20

+0

@hpique查看此文档:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID35 section'扩展。 最后一条语句声明'您不能使用扩展来覆盖Objective-C类型上的现有方法或属性。' 如果发现冲突签名,编译器将返回错误。 – lukewar 2015-10-26 10:30:56