环境:
Swift >=2.3,Swift 应用程序中的 Swift 框架
设置:
APIService.framework
。 public class APIService.swift
并且它
具有静态功能。它还有另一个
public class Item.swift
.一个快速的应用程序,使用
APIService.framework
APIService.function()
class Item.swift
如果 App 需要引用框架的 Item 类,它必须这样做
APIService.Item
但由于 APIService 是框架内的一个类,编译器总是尝试在 APIService 类而不是 APIService 模块中查找属性,因此抛出错误提示
'Item' is not a member type of 'APIService'
可能的解决方案:
所有这些都只是解决方法,真正的问题仍然是编译器无法区分模块名称和类名称。我们在 Swift 中有什么东西可以让我说
"Don't look into the ModuleName.swift, instead look into the whole Module"
吗?
基于this answer,看起来你可以直接从模块中导入单一类型来解决这个问题。
import class APIService.Item
那么大家可以直接参考
Item
,不会混淆
class
、protocol
、struct
、enum
和 func
关键字(至少)在这种情况下有效。
Swift 中的符号名称冲突是个老问题,因为编译器按照以下优先顺序解析名称:
您的应用程序的
Item
类名覆盖了从 APIService
模块导入的类名,APIService
类名在您的案例中覆盖了它的模块名称,这样您就无法再访问 APIService.Item
了。
唯一的解决方案是将框架导入到一个清晰的名称空间(模块)而不会发生冲突、类型别名,然后将其重新导入到您的应用程序中,为此您可以制作一个包装器框架并链接您的第三方库,即:
Your App
-> Wrapper Framework(typealias)
-> Target Framework
.
让我们
APIService
框架有实施:
APIService.swift
public class APIService {
public static func test() {
print("APIService")
}
}
public class Item {
public static func test() {
print("APIService.Item")
}
}
制作
Dependencies
框架,将其与APIService
框架链接并添加此文件:
Dependencies.swift
import APIService
public typealias APIService_Item = Item
现在您可以将
Dependencies
框架链接到您的应用程序(APIService
自动链接)并将库导入您的代码:
App.swift
import Dependencies
import APIService
class Item {
static func test() {
print("App.Item")
}
}
...
Item.test() // Prints: App.Item
APIService.test() // Prints: APIService
APIService_Item.test() // Prints: APIService.Item
因此,正如您从测试中看到的那样,我们可以访问
APIService.Item
课程。