簡體   English   中英

當另一個模塊在 Swift 中具有自己的名稱時,引用另一個模塊中的類型與當前模塊中的類型同名

[英]Referring to a type in another module with the same name as a type in the current module when the other module has a type with its own name in Swift

我正在使用 swift package 管理器。 我有一個模塊ModuleA ,它導出兩種類型: ModuleATest 我有一個模塊ModuleB ,它定義了一個類型: Test ModuleB中,如何從ModuleA引用類型Test 理想情況下,我希望#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枚舉中刪除時成功。

問題是 ModuleA 模塊中的ModuleA枚舉沒有Test

當您在ModuleA enum中刪除public時, ModuleB無法識別存在ModuleA enum ,因為它的訪問修飾符默認為internal ,因此ModuleB識別ModuleA中的Test結構,而不是嘗試在ModuleA enum中查找Test


獎勵: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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM