2

我正在使用快速包管理器。我有一个ModuleA导出两种类型的模块:ModuleATest. 我有一个ModuleB定义单一类型的模块:Test. 在ModuleB中,我如何引用来自的Test类型ModuleA?理想情况下,我想要#module(ModuleA)直接引用模块的语法ModuleA

可重现的例子:

Package.swift

// swift-tools-version:5.3

import PackageDescription

let package = Package(
    name: "ShadowingTest",
    products: [
        .library(
            name: "ModuleA",
            targets: ["ModuleA"]),
        .library(
            name: "ModuleB",
            targets: ["ModuleB"]),
    ],
    dependencies: [
    ],
    targets: [
        .target(
            name: "ModuleA",
            dependencies: []),
        .target(
            name: "ModuleB",
            dependencies: ["ModuleA"]),
    ]
)

Sources/ModuleA/ModuleA.swift

public enum ModuleA {}
public struct Test {
    public static let module: String = "ModuleA"
}

Sources/ModuleB/ModuleB.swift

import ModuleA

struct Test {
    static let module: String = "ModuleB"
}

func test() {
    print(ModuleA.Test.module)
}

运行swift build错误

Sources/ModuleB/ModuleB.swift:8:19: error: type 'ModuleA' has no member 'Test'

但是当publicModuleA枚举中删除时成功ModuleA

4

1 回答 1

2

问题是ModuleAModuleA 模块中的枚举没有Test.

当您删除public时,ModuleA enumModuleB无法识别存在,ModuleA enum因为它的访问修饰符internal默认情况下是ModuleB识别Test结构而ModuleA不是尝试查找TestModuleA enum


奖励:SO中有一个关于访问修饰符的答案,我认为您会发现它很有用。


编辑:

如果ModuleA.Test即使有一个命名的枚举也需要使用,ModuleA那么您可以使用import (class|struct|func|protocol|enum) <needed_component>,所以在您的情况下,您应该像这样导入:

import struct ModuleA.Test

如果你想使用另一个名字的结构来避免命名冲突,那么你可以设置一个 typealias ->

import struct ModuleA.Test

typealias TestA = ModuleA.Test
于 2021-05-22T00:05:08.583 回答