前缀扩展功能

时间:2014-08-29 11:50:53

标签: ios macos swift naming-conventions

在Swift中,它不再需要prefix classes,因为它们的模块充当命名空间。

前缀扩展功能怎么样?例如:

extension UIImage {

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

}

一方面,Swift不是动态的,因此冲突会产生编译错误。

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

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

2 个答案:

答案 0 :(得分:20)

这里有一些微妙之处:

Objective-C类型的扩展被实现为Objective-C类别,所有这些都暗示着。

然而,

Swift类型的扩展仅在由于导入而可见的情况下生效。这意味着您不会意外地踩踏私有系统方法(无论是现在还是将来引入的方法),如果系统引入了与您的名称相同的公共方法,您将获得编译重建时失败,但现有的应用程序不会中断。

答案 1 :(得分:0)

您还应该检查这些线程:

Name collisions for extension methods from different frameworks-从线程引用:“无论应用程序代码导入哪个Framework,似乎实际调用的实现都取决于链接框架和库中“先到先得”的顺序。但是,据我所知,这种行为不能得到保证。”

Swift Extension: same extension function in two Modules也确认了相同的问题。

因此,基于此,对于示例名称中的UIImage之类的Objective-C对象,可能会发生冲突,并且如果在Objective-C对象的两个不同扩展中存在两个具有相同名称的方法,则您可能会看到意外的行为。