当前位置: 首页 > 面试题库 >

如何区分具有相同名称的类型和模块?

汪飞捷
2023-03-14
问题内容

我正在尝试在一个项目中使用KárolyLőrentey的B树OrderedSet。但是,我遇到了一个问题,即我不能声明不合格,OrderedSet<T>因为该名称在Foundation的NSOrderedSet(如OrderedSet在Swift
3中导入的)和BTree的之间发生冲突OrderedSet

let set = OrderedSet<Int>()
// error: 'OrderedSet' is ambiguous for type lookup in this context
// Found this candidate: Foundation.OrderedSet:3:14
// Found this candidate: BTree.OrderedSet:12:15

要解决此冲突,通常可以使用该名称,然后使用即可BTree.OrderedSet<T>。但是,该BTree模块还包含一个名为的类BTree。如果我写的话BTree.OrderedSet,Swift认为我指的OrderedSet是嵌套在该BTree.BTree类型中的名为type的类型。

let set = BTree.OrderedSet<Int>()
// error: reference to generic type 'BTree' requires arguments in <...>

如果不这样做import BTree,我将根本无法使用该BTree名称。

// no import BTree
let set = BTree.OrderedSet<Int>()
// error: use of undeclared type 'BTree'

如何解决BTree类型和BTree模块之间的这种歧义?


问题答案:

可以使用鲜为人知的import (class|struct|func|protocol|enum) Module.Symbol语法消除类型的歧义。

import struct BTree.OrderedSet

从这一点开始,OrderedSet明确引用了BTree中的那个。

如果在某些文件中这仍然是模棱两可或次优的,则可以创建一个Swift文件来使用类型别名重命名导入:

// a.swift
import struct BTree.OrderedSet
typealias BTreeOrderedSet<T> = BTree.OrderedSet<T>



// b.swift
let foo = OrderedSet<Int>() // from Foundation
let bar = BTreeOrderedSet<Int>() // from BTree

Swift 3讨论了一种新语法,但失败了。



 类似资料:
  • 问题内容: 以下代码可以正常工作。在两个不同的结构上操作并打印该结构的字段的两种方法: 在控制台中显示所需的输出: 现在 ,如果我以以下方式更改方法签名,则会出现编译错误。我只是将方法的接收者移动到方法的参数: 我什至无法编译程序: 问 :为什么 当 方法具有相同的名称和Arity 时 ,我可以在接收器中互换结构类型,而不能在参数中互换结构类型? 问题答案: 因为Go不支持在其参数类型上重载用户定

  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方

  • 获取JAXB异常,如“两个类具有相同的XML类型名称…”, 以下是例外情况的详细信息: 异常在线程"main"com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsExcema: 1计数的IllegalAnnotationExceptions两个类有相同的XML类型名称"城市"。使用@XmlType.name和@XmlType.namespa

  • 我使用的是,我需要展平包含同名字段的文档。 我创建的文档如下所示: 在那之后,我试图像下面这样压平文档: 我的主要方法是: 展平后,我得到的文档包含一个展平字段,但我必须得到两个展平字段。 如何解决此问题?

  • API调用 API响应equation_list字段包含整数数组或字符串。例如: 但我有个例外 com.google.gson.java.lang.IllegalStateException:预期BEGIN_ARRAY但在第1行第1586列路径$[5]处是STRING。equation_list 我如何满足我的要求?

  • 假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?