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

问题描述 投票:0回答:2

环境

Swift >=2.3,Swift 应用程序中的 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'

可能的解决方案:

  • 将框架的模块名称更改为类以外的名称 姓名。
  • 将类名更改为模块名称以外的名称。
  • 在 APIService 类中放置一个“Item”静态属性指向
    框架中的项目类。

所有这些都只是解决方法,真正的问题仍然是编译器无法区分模块名称和类名称。我们在 Swift 中有什么东西可以让我说

"Don't look into the ModuleName.swift, instead look into the whole Module"
吗?

swift module namespaces
2个回答
3
投票

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

import class APIService.Item

那么大家可以直接参考

Item
,不会混淆

class
protocol
struct
enum
func
关键字(至少)在这种情况下有效。


0
投票

Swift 中的符号名称冲突是个老问题,因为编译器按照以下优先顺序解析名称:

  1. 本地声明
  2. 进口报关
  3. 进口模块

您的应用程序的

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
课程。

© www.soinside.com 2019 - 2024. All rights reserved.