是否可以为导入设置别名?

时间:2016-09-16 17:27:11

标签: swift swift3

在c#中引入与现有代码有很多名称冲突的库时,有一种方法可以对导入进行别名,因此您无需为每次使用完全阐明命名空间。例如:

using MyCompany.MyLibrary.Model as MMM

然后你可以做

MMM.MyObject

而不是

MyCompany.MyLibrary.Model.MyObject

随着最近对swift 3.0的更新,我发现我的一些模型对象现在与Foundation类型发生冲突,并且我被迫为曾经拥有{{1}的东西添加前缀使用NS在类名中添加前缀。如果我可以输入别名导入我的模型库就好了,就像上面给出的c#示例一样。这在swift 3.0中是否可行?如果没有,是否有另一种策略可以避免名称冲突导致必须在每种类型前面编写框架名称?我正在考虑像我们在obj-c中那样回到我的班级名称前缀,但是在我这样做之前我正试图探索我的选择。

2 个答案:

答案 0 :(得分:12)

<强>一般

您可以导入特定实体以及整个模块:

import struct­ SomeModule.SomeStruct
import class­ SomeModule.SomeClass
import func SomeModule.someFunc

查看&#34; importable&#34;的完整列表实体类型in the import-kind rule of Swift grammar

然后您可以创建typealias

typealias SMSomeStruct = SomeModule.SomeStruct

而且,从Swift 3开始,没有import声明与别名相结合。

考虑与Foundation实体的冲突

说,你有一个班级SomeModule.NumberFormatter

在单独的Swift文件(在导入项目中)中创建两个typealias以防止冲突就足够了:

import Foundation
import SomeModule

typealias NumberFormatter = Foundation.NumberFormatter
typealias SMNumberFormatter = SomeModule.NumberFormatter

答案 1 :(得分:0)

即使在 Swift 5 中也不能直接在 import-statement 中使用别名!?

但幸运的是,我可以通过以下方式解决它:

import typealias MyModule.MyInnerClass

我的意思是,如果我们是模块的开发者,只需将别名移动到模块中,例如:

public typealias MyInnerClass = MyClass.MyInnerClass

public class MyClass {
    public class MyInnerClass {
        // Some cool logic here...
    }
}