gpt4 book ai didi

swift - 当另一个模块在 Swift 中具有具有自己名称的类型时,引用另一个模块中与当前模块中的类型同名的类型

转载 作者:行者123 更新时间:2023-12-04 07:37:51 25 4
gpt4 key购买 nike

我正在使用快速包管理器。
我有一个模块 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'
但在 public 时成功已从 ModuleA 中删除 ModuleA 中的枚举.

最佳答案

问题是 ModuleA ModuleA 模块中的枚举没有 Test .
当您删除 publicModuleA enum然后 ModuleB无法识别有 ModuleA enum因为它的访问修饰符是 internal默认为 ModuleB识别 Test ModuleA 中的结构而不是试图找到TestModuleA enum
奖励:有一个answer在关于访问修饰符的 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

关于swift - 当另一个模块在 Swift 中具有具有自己名称的类型时,引用另一个模块中与当前模块中的类型同名的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67644895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com