Swift -当框架/模块具有相同名称的类时,无法使用命名空间

avwztpqn  于 2023-02-28  发布在  Swift
关注(0)|答案(2)|浏览(239)
    • 环境**:

Swift〉= 2.3,Swift应用程序中的Swift框架

    • 设置:**
  • Swift动态框架,模块名为APIService.framework
  • 它有一个public class APIService.swift,并且有静态函数。
  • 它有另一个public class Item.swift
  • 使用APIService.framework的快速应用程序
  • 应用程序可与APIService.function()等框架配合使用
  • 应用程序还具有class Item.swift

如果应用程序需要引用框架的Item类,则必须执行APIService.Item,但由于APIService是框架内的类,因此编译器始终尝试在APIService类内而不是在APIService模块中查找属性,因此抛出错误消息

'Item' is not a member type of 'APIService'
    • 可能的解决方案:**
  • 将框架的模块名称更改为类名以外的名称。
  • 将类名更改为"模块名"以外的其他名称。
  • 在APIService类中放置一个"Item"静态属性,该属性指向

框架中的项类。
所有这些都只是解决方法,真正的问题仍然是编译器不能区分模块名和类名。我们在Swift中有什么东西可以让我说"Don't look into the ModuleName.swift, instead look into the whole Module"吗?

lbsnaicq

lbsnaicq1#

基于this answer,看起来可以直接从模块导入单个类型来解决这个问题。

import class APIService.Item

这样就可以直接引用Item而不会产生混淆。
classprotocolstructenumfunc关键字(至少)适用于这种情况。

wrrgggsh

wrrgggsh2#

这是Swift中符号名称冲突的老问题,因为编译器按照以下优先级顺序解析名称:
1.本地声明
1.导入的声明
1.导入的模块
您的应用的Item类名将覆盖从APIService模块导入的类名,而APIService类名将覆盖其模块名称,因此您无法再访问APIService.Item
唯一的解决方案是将框架导入到一个清晰的命名空间(模块)中,而不会发生冲突和类型别名,然后将其重新导入到您的应用中。为此,您可以创建一个 Package 器框架,并在以下位置链接您的第三方库:
x一米四氮一x-〉x一米五氮一x-〉x一米六氮一x
让我们的APIService框架有实现:

API服务.swift

public class APIService {
    public static func test() {
        print("APIService")
    }
}

public class Item {
    public static func test() {
        print("APIService.Item")
    }
}

制作Dependencies框架,将其与APIService框架链接并添加此文件:

依赖关系.swift

import APIService

public typealias APIService_Item = Item

现在,您可以将Dependencies框架链接到您的应用中(APIService会自动链接),并将库导入到您的代码中:

应用程序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类。

相关问题